¿Cómo ejecuto un programa con argumentos de línea de comandos usando GDB dentro de un script Bash?

429

Cuando se ejecuta un programa en GDB, generalmente, los argumentos para el programa se dan en el runcomando. ¿Hay alguna manera de ejecutar el programa usando GDB y también dar argumentos dentro de un script de shell?

Vi una respuesta en una pregunta relacionada, mencionando que podemos adjuntar GDB al programa después de que el script comience a ejecutarse. Pero luego tendré que 'esperar' el programa.

Hay otra manera de hacer esto?

drox
fuente
2
posible duplicado de Cómo pasar argumentos y redirigir stdin desde un archivo al programa ejecutado en gdb?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Respuestas:

613

Puede ejecutar gdb con el parámetro --args,

gdb --args executablename arg1 arg2 arg3

Si desea que se ejecute automáticamente, coloque algunos comandos en un archivo (por ejemplo, 'ejecutar') y dele como argumento: -x / tmp / cmds. Opcionalmente, puede ejecutar con el modo -batch.

gdb -batch -x /tmp/cmds --args executablename arg1 arg2 arg3
Hugo Ideler
fuente
53
Argg, man gdbno contiene --args, por eso no lo encontré. gdb --helphace.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
1
@CiroSantilli 新疆 改造 中心 法轮功 六四 事件 GDB es GNU. Para ver la documentación completa de las herramientas GNU, recuerde usar la info gdbpróxima vez :-).
Apteryx
1
@Apteryx tal vez algún día aprenderé info. Si Google o Stack Overflow deja de funcionar XD
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
1
@CiroSantilli 新疆 改造 中心 法轮功 六四 事件 Me enganché a la información después de descubrir la tecla 'i' ( index-search). Pruebe:, info gdbluego 'i', luego '--args'. Te llevará directamente a eso.
Apteryx
140
gdb -ex=r --args myprogram arg1 arg2

-ex=res la abreviatura de -ex=runy le dice a gdb que ejecute su programa de inmediato, en lugar de esperar a que escriba "ejecutar" en el indicador. Luego --argsdice que todo lo que sigue es el comando y los argumentos, tal como los escribiría normalmente en la línea de comandos.

Hugo
fuente
¡No sabía sobre lo -exe=rmuy útil!
Jeef
46

Otra forma de hacer esto, que personalmente considero un poco más conveniente e intuitiva (sin tener que recordar el --argsparámetro), es compilar normalmente y usar r arg1 arg2 arg3directamente desde adentro gdb, así:

$ gcc -g *.c *.h
$ gdb ./a.out
(gdb) r arg1 arg2 arg3
aspiring_sarge
fuente
23
Esto es exactamente lo que el OP espera evitar tener que hacer.
KarateSnowMachine
66
Hmmm, sí, gracias, punto justo. No estoy seguro de cómo se me escapó mi aviso durante tanto tiempo. Sin embargo, creo que dejaré la respuesta aquí, porque iirc, me topé con esta pregunta cuando busqué en Google algo así como "Cómo pasar argumentos de línea de comando usando gdb", y al encontrar la respuesta que faltaba, la agregué. , sin darme cuenta (¡durante casi un año!) de que mi respuesta no abordaba la pregunta en cuestión.
aspiring_sarge
2
@KarateSnowMachine Como alguien que llega de Google también, esta respuesta está más en la línea de lo que estaba buscando. Tal vez deberíamos revisar la pregunta para que sea más general, ya que tiene un título tan general, o tal vez deberíamos limitar el título. Hacerlo menos restrictivo probablemente sería más útil para la mayor cantidad de lectores.
jpmc26
18

Puede crear un archivo con contexto:

run arg1 arg2 arg3 etc

program input

Y llama a gdb como

gdb prog < file
George Kastrinis
fuente
4

gdb tiene --init-command <somefile>donde somefile tiene una lista de comandos gdb para ejecutar, lo uso para tener //GDBcomentarios en mi código, luego `

echo "file ./a.out" > run
grep -nrIH "//GDB"|
    sed "s/\(^[^:]\+:[^:]\+\):.*$/\1/g" |
    awk '{print "b" " " $1}'|
    grep -v $(echo $0|sed "s/.*\///g") >> run
gdb --init-command ./run -ex=r

como un script, que coloca el comando para cargar los símbolos de depuración, y luego genera una lista de comandos de interrupción para poner un punto de interrupción para cada //GDBcomentario, y comienza a ejecutar

Austin_Anderson
fuente
4

Si el --argsparámetro no funciona en su máquina (es decir, en Solaris 8), puede iniciar gdb como

gdb -ex "set args <arg 1> <arg 2> ... <arg n>"

Y puede combinar esto con ingresar un archivo a stdin y "ejecutarse inmediatamente":

gdb -ex "set args <arg 1> <arg 2> ... <arg n> < <input file>" -ex "r"
Johannes
fuente
2

Además de la respuesta de Hugo Ideler. Cuando utilicé argumentos con el mismo prefijo como --o -, no estaba seguro de entrar en conflicto con gdb one.

Parece que gdb toma todas las argsopciones como argumentos para el programa.

Al principio quería estar seguro, ejecuté gdb con comillas alrededor de sus argumentos, se elimina en el lanzamiento.

Esto también funciona, pero opcional:

gdb --args executablename "--arg1" "--arg2" "--arg3"

Esto no funciona

gdb --args executablename "--arg1" "--arg2" "--arg3" -tui

En ese caso, -tuise usa como parámetro de mi programa, no como gdb one.

Sandburg
fuente
1

Demasiado tarde, pero aquí hay un método que funciona durante la gdbsesión.

gdb <executable>

entonces

(gdb) apropos argument

Esto devolverá muchas coincidencias, la útil es set args.

set args -- Set argument list to give program being debugged when it is started.

set args arg1 arg2 ...

entonces

r

Esto ejecutará el programa, pasando a main (argc, argv) los argumentos y el recuento de argumentos.

alinsoar
fuente