¿Cómo cargar un programa leyendo stdin y tomando parámetros en gdb?

101

Tengo un programa que toma la entrada de stdin y también toma algunos parámetros de la línea de comando. Se parece a esto:

cat input.txt > myprogram -path "/home/user/work"

Intento depurar el código con gdb dentro de emacs, por Mx gdb, trato de cargar el programa con el comando:

gdb cat input.txt > myprogram -path "/home/user/work"

Sin embargo, a gdb no le gusta.

Pregunta desde aquí . Desafortunadamente, no entiendo la solución y no estoy seguro de qué hacer más allá de compilar con la -gopción y ejecutar el comando Mx gdb.

vinc456
fuente

Respuestas:

132

Si lo estuviera haciendo desde un shell, lo haría así:

% gdb myprogram
gdb> run params ... < input.txt

Esto parece funcionar también dentro de emacs.

Alnitak
fuente
La redirección parece funcionar, pero obtengo algunos errores. No se pudo leer una imagen de archivo de objeto válida de la memoria. Programa terminado con el código 042. ¿Alguna idea?
vinc456
Es probable que sea un error general de GDB, y probablemente no tenga nada que ver con el hecho de que está ejecutando emacs. Aprenda a ejecutar GDB desde un shell primero (con una nueva pregunta si es necesario) y luego preocúpese por ejecutarlo dentro de emacs.
Alnitak
1
Me lo imaginé. Por alguna razón, escribí void main (int argc, char * argv []) en lugar de "int main ..." y se me escapó. De todos modos todo funciona bien ahora; ¡gracias por tu ayuda!
vinc456
2
Un agradecimiento tardío: el manual de gdb es un dolor en el trasero para leer.
Eliminado el
1
En Windows usando msys64 obtengo <y input.txtcomo argvargumentos para mi programa :( Seguiré investigando estas respuestas con mi gdb 8.2.1: stackoverflow.com/questions/3544325/…
ixe013
32

Hay varias formas de hacerlo:

$ gdb myprogram
(gdb) r -path /home/user/work < input.txt

o

$ gdb myprogram
(gdb) set args -path /home/user/work < input.txt
(gdb) r

o

$ gdb -ex 'set args -path /home/user/work < input.txt' myprogram
(gdb) r

donde el runcomando gdb ( r) usa por defecto los argumentos establecidos previamente con set args.

maxschlepzig
fuente
4
Cuando intento esto con gdb en cygwin, no funciona. El comando "show args" muestra que ingresé los argumentos que quería, pero cuando inicio el programa con "r", el programa espera hasta que escribo cosas en lugar de leer el archivo especificado.
Hombre del espacio
1
@cardiffspaceman, bueno, no puedo probarlo con Cygwin, tal vez su versión de gdb sea de alguna manera limitada
maxschlepzig
¿Por qué no simplemente gdb -ex 'r -path /home/user/work < input.txt' myprogramen la tercera variante?
Ruslan
@Ruslan, también funciona: usar 'set args ...' solo le da la oportunidad de definir interactivamente algunos puntos de interrupción
etc.antes de
Es cierto, pero también puede establecer el punto de interrupción de forma no interactiva, por ejemplo gdb -ex 'b main' -ex 'r -path /home/user/work < input.txt' myprogram.
Ruslan
6

En aras de la integridad al iniciar una sesión de depuración, también existe la opción --args. es decir)

gdb gdbarg1 gdbarg2 --args yourprog arg1 arg2 -x arg3
vinc456
fuente
14
¿Cómo redirigiría input.txt como entrada a su programa al iniciar una sesión de depuración como esta?
Peter Ajtai
1
@Peter:gdb --args yourprog.out input.txt
Ben Elgar
1
Eso solo funciona si "yourprog" espera que un nombre de archivo especifique la entrada, no la redirección de entrada.
Alnitak
0

Y si no necesita depurar desde el principio, también puede adjuntarlo a un proceso que ya se esté ejecutando mediante:

$ gdb myprogram xxx

donde xxx es la identificación del proceso. Entonces no necesitas decirle a gdb los argumentos iniciales.

Zitrax
fuente
4
No pudo responder al título de la pregunta, en la parte "reading stdin". Haría un buen comentario en alguna parte si fuera más corto.
Notinlist