shell gdb

shell - Invoque gdb para pasar automáticamente argumentos al programa que se está depurando



(8)

Me gustaría escribir un script que (bajo ciertas condiciones) ejecute gdb y ejecute automáticamente algún programa X con un conjunto de argumentos Y. Una vez que el programa ha terminado de ejecutarse, el usuario debe permanecer en el indicador de gdb hasta que lo / la cierre explícitamente .

Una forma de hacer esto sería hacer que el script emita el comando de ejecución más los argumentos Y a algún archivo F y luego hacer que el script invoque gdb de la siguiente manera:

gdb X < F

¿Pero hay una manera de hacer esto sin introducir un archivo temporal?

Gracias.


Si desea ejecutar algunos comandos a través de GDB y luego hacer que salga o ejecute hasta la finalización, simplemente haga

echo commands | gdb X

Si desea dejarlo en el símbolo del sistema después de ejecutar esos comandos, puede hacer

(echo commands; cat) | gdb X

Esto hace que los comandos se hagan eco de GDB, y luego se escribe en el proceso cat , que copia su stdin a stdout, que se canaliza en GDB.


La forma más fácil de hacerlo es dar un programa X y una lista de parámetros abc :

X a b c

Es usar la opción --args gdb , de la siguiente manera:

gdb --args X a b c

gdb --help tiene esto que decir sobre --args :

--args Arguments after executable-file are passed to inferior

Lo que significa que el primer argumento después de --args es el ejecutable para depurar, y todos los argumentos posteriores se pasan a ese ejecutable.


cat F | gdb X cat F | gdb X debe ser idéntico. De modo que puede usar cualquier cosa que produzca salida y conectarlo a gdb en lugar del comando cat aquí.

Supongo que estás correcto y gdb lee de stdin.


hay una opción -x , por ejemplo

gdb -x gdb_commands exe_file

donde gdb_commands puede ser, por ejemplo (en el caso del emulador de Android):

target remote :5039


Bueno, esto es solo un comentario, realmente no una respuesta, solo quería incluir algunos fragmentos de código. Estoy en bash / Ubuntu Lucid, y para mí, tuve casi los mismos problemas que en: " GDB tiene problemas para enviar comandos a STDIN - Unix Linux Forum - Fixunix.com ".

Básicamente, me gustaría lograr lo mismo que en el siguiente fragmento:

$ gdb GNU gdb (GDB) 7.1-ubuntu Copyright (C) 2010 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "i486-linux-gnu". For bug reporting instructions, please see: <http://www.gnu.org/software/gdb/bugs/>. (gdb) pwd Working directory /media/work/dir. (gdb)

... excepto que me gustaría "conectar" el comando pwd alguna manera, y mantener gdb abierto después (como en el ejemplo anterior).

He intentado algunas de las sugerencias aquí, y lo único que funciona para mí es (echo commands; cat) | gdb sintaxis (echo commands; cat) | gdb - así como (algo que funciona) Aquí Cuerdas - aquí están mis resultados:

$ echo "pwd" | gdb (gdb) Hangup detected on fd 0 error detected on stdin $ echo "pwd" | gdb -x /dev/stdin GNU gdb (GDB) 7.1-ubuntu ... /dev/stdin: Invalid argument. (gdb) Hangup detected on fd 0 error detected on stdin $ gdb -x <(echo "pwd") GNU gdb (GDB) 7.1-ubuntu ... /dev/fd/63: No such file or directory. (gdb) q $ gdb -e "pwd" GNU gdb (GDB) 7.1-ubuntu ... For bug reporting instructions, please see: <http://www.gnu.org/software/gdb/bugs/>. (gdb) q # nothing happens $ gdb <<<"pwd" GNU gdb (GDB) 7.1-ubuntu ... (gdb) Working directory /media/work/dir. (gdb) quit # OK, but autoexits $ gdb <<<"pwd > " GNU gdb (GDB) 7.1-ubuntu ... (gdb) Working directory /media/work/dir. (gdb) Working directory /media/work/dir. (gdb) quit # with a line break at end, it execs twice, then exits # the only one OK for my needs - # except locks after quit, and needs Ctrl-C $ (echo "pwd"; cat) | gdb GNU gdb (GDB) 7.1-ubuntu ... (gdb) Working directory /media/work/dir. (gdb) q ^C

Bueno, espero que esto ayude a alguien,
¡Aclamaciones!


Editar: Ahora al menos sé por qué la sustitución de procesos no funcionará: usará un descriptor de archivo temporal, que no puede reconocerse como un archivo por ls (por lo tanto, gdb definitivamente no puede leerlo, además, la referencia desaparece casi de inmediato, a menos que el proceso de alguna manera está bloqueado, como con cat ) - vea el fragmento de registro de terminal:

$ echo -e "***/n" <(echo "pwd") "/n***/n`cat <(ls -C /dev/fd ; echo; for ix in /dev/fd/*; do irl=$(readlink -f $ix); echo $ix -/> $irl; ls -la $ix 2>&1; ls -la $irl 2>&1; echo ''______''; done ; ls -C /dev/fd )`" *** /dev/fd/63 *** 0 1 2 3 63 /dev/fd/0 -> /dev/pts/0 lrwx------ 1 user user 64 2010-11-07 21:18 /dev/fd/0 -> /dev/pts/0 crw--w---- 1 user tty 136, 0 2010-11-07 21:18 /dev/pts/0 ______ /dev/fd/1 -> /proc/10713/fd/pipe:[236191] l-wx------ 1 user user 64 2010-11-07 21:18 /dev/fd/1 -> pipe:[236151] ls: cannot access /proc/10713/fd/pipe:[236191]: No such file or directory ______ /dev/fd/2 -> /dev/pts/0 l-wx------ 1 user user 64 2010-11-07 21:18 /dev/fd/2 -> pipe:[236151] crw--w---- 1 user tty 136, 0 2010-11-07 21:18 /dev/pts/0 ______ /dev/fd/255 -> /proc/10721/fd/255 ls: cannot access /dev/fd/255: No such file or directory ls: cannot access /proc/10721/fd/255: No such file or directory ______ /dev/fd/3 -> /proc/10725/fd/3 ls: cannot access /dev/fd/3: No such file or directory ls: cannot access /proc/10725/fd/3: No such file or directory ______ 0 1 2 3

Además, las teclas arriba / abajo no funcionan con (echo commands; cat) | gdb (echo commands; cat) | gdb , porque así es como se comporta el gato; si solo ejecutamos cat para que copie stdin a stdout, obtenemos:

$ cat # or `cat -`: and start pressing up/down keys - and get: ^[[A^[[B^[[A^[[B^[[A^[[B^C

Puede tratar de activar el modo de caracteres stty -cooked ( o desactivar el modo de almacenamiento en búfer / cocinado ) con stty -cooked , y luego cat escribirá los caracteres como ^[[A , y moverá el cursor - desafortunadamente, en este modo, Ctrl-C ya no funciona, por lo que no podrás cerrar el cat de esa manera ...


gdb target -e "my-automation-commands"

my-automation-commands que contiene todo lo que normalmente querrías ejecutar,

break 0x123 set args "foo" bar 2 r

No es estrictamente un archivo temporal, si tiene algunos scripts de inicio estándar;)


Con bash puedes crear una secuencia de comandos que le de a los usuarios como entrada a cualquier ejecutable que estés ejecutando:

#!/bin/sh gdb X <<GDB_INPUT pwd run X a b c quit GDB_INPUT


Después de probar todas las respuestas aquí,

  1. El hack echo / cat, aunque inteligente, rompe bastantes características importantes de gdb. En particular, todos los mensajes del usuario se responden automáticamente (para que no tenga la oportunidad de confirmar operaciones potencialmente peligrosas), y Ctrl + C (para detener un proceso que está depurando) termina matando a gato, por lo que no puede habla con gdb después de eso.
  2. Se supone que la opción -x funciona, pero no pude hacer que funcione con mi versión de gdb, y requiere un archivo temporal.

Sin embargo, resulta que puedes usar -ex, así:

gdb -ex "target remote localhost:1234"

¡También puede especificar -ex varias veces para ejecutar múltiples comandos!