Normalmente ejecuto un programa como:
./a.out arg1 arg2 <file
Me gustaría depurarlo usando gdb.
Soy consciente de la set args
funcionalidad, pero eso solo funciona desde el indicador gdb.
Pase los argumentos al run
comando desde dentro de gdb.
$ gdb ./a.out
(gdb) r < t
Starting program: /dir/a.out < t
r
es la abreviatura derun
y puedes seguirlo con cualquier argumento. Como en esta pregunta, sería:r arg1 arg2 <file
o podría serrun arg1 arg2 <file
$ gdb ./a.out
,(gdb) r < t arg1 arg2
que me funciona bien. En mi casoa.out = nft
arg1 = import
arg2 = json
yt = file containing json rules
Puedes hacerlo:
El ser mágico
--args
.Simplemente escriba
run
la consola de comandos de gdb para iniciar la depuración.fuente
--args
entonces no hay ningún argumento pasado al ejecutable, por lo que no es ambiguo.argv[0]
es el nombre del ejecutablegdb
misma en elof
archivo y dar lugar a GDB intentar ejecutar comandos de ellaSi desea tener un
run
comando simplegdb
para ejecutar su programa con redirecciones y argumentos, puede usarset args
:No pude lograr el mismo comportamiento con el
--args
parámetro,gdb
escapa ferozmente de las redirecciones, es decirEste realmente redirige la entrada de gdb en sí, no lo que realmente queremos aquí
fuente
Inicie GDB en su proyecto.
Vaya al directorio del proyecto, donde ya compiló el ejecutable del proyecto. Emita el comando gdb y el nombre del ejecutable como se muestra a continuación:
gdb projectExecutablename
Esto inicia gdb, imprime lo siguiente: GNU gdb (Ubuntu 7.11.1-0ubuntu1 ~ 16.04) 7.11.1 Copyright (C) 2016 Free Software Foundation, Inc. ............... .................................. Escriba "apropos word" para buscar comandos relacionados con "word" .. Lectura de símbolos del nombre del proyecto ejecutable ... hecho. (gdb)
Antes de comenzar a ejecutar su programa, desea configurar sus puntos de interrupción. El comando break te permite hacerlo. Para establecer un punto de interrupción al comienzo de la función denominada main:
(gdb) b principal
Una vez que tenga el indicador (gdb), el comando ejecutar inicia la ejecución del ejecutable. Si el programa que está depurando requiere argumentos de línea de comandos, especifíquelos en el comando de ejecución. Si desea ejecutar mi programa en el archivo "xfiles" (que se encuentra en una carpeta "mulder" en el directorio del proyecto), haría lo siguiente:
(gdb) r mulder / xfiles
Espero que esto ayude.
Descargo de responsabilidad: esta solución no es mía, está adaptada de https://web.stanford.edu/class/cs107/guide_gdb.html Esta breve guía de gdb fue, muy probablemente, desarrollada en la Universidad de Stanford.
fuente
¿No sería bueno simplemente escribir
debug
delante de cualquier comando para poder depurarlo congdb
a nivel de shell?Debajo de esta función. Incluso funciona con lo siguiente:
Esta es una llamada en la que no puede controlar nada, todo es variable, puede contener espacios, avances de línea y metacaracteres de shell. En este ejemplo,
in
,out
,two
, ythree
son arbitrarias otros comandos que consumen o producen datos que no deben ser perjudicados.La siguiente
bash
función invocagdb
casi limpiamente en un entorno de este tipo [ Gist ]:Ejemplo sobre cómo aplicar esto: simplemente escriba
debug
en frente:Antes de:
Después:
Eso es. Ahora es absolutamente obvio para depurar
gdb
. Excepto por algunos detalles o más:gdb
no se cierra automáticamente y, por lo tanto, mantiene abierta la redirección de E / S hasta que salgagdb
. Pero yo llamo a esto una característica.No puede pasar fácilmente
argv0
al programa como conexec -a arg0 command args
. Lo siguiente debería hacer este truco: Después deexec-wrapper
cambiar"exec
a"exec -a \"\${DEBUG_ARG0:-\$1}\"
.Hay FDs superiores a 1000 abiertos, que normalmente están cerrados. Si esto es un problema, cambie
0<&1000 1>&1001 2>&1002
a leer0<&1000 1>&1001 2>&1002 1000<&- 1001>&- 1002>&-
No puede ejecutar dos depuradores en paralelo. También puede haber problemas, si algún otro comando consume
/dev/tty
(o STDIN). Para arreglar eso, reemplace/dev/tty
con"${DEBUGTTY:-/dev/tty}"
. En otro tipo de TTYtty; sleep inf
y luego use el TTY impreso (i. E./dev/pts/60
) para la depuración, como enDEBUGTTY=/dev/pts/60 debug command arg..
. Ese es el poder de Shell, ¡acostúmbrate!Función explicada:
1000<&0 1001>&1 1002>&2
aleja los primeros 3 FD0</dev/tty 1>/dev/tty 2>&0
restaura los primeros 3 FD para apuntar a su TTY actual. Para que puedas controlargdb
./usr/bin/gdb -q -nx -nw
ejecutagdb
invocacionesgdb
en shell-ex 'set exec-wrapper /bin/bash -c "exec 0<&1000 1>&1001 2>&1002 \"\$@\""
crea un contenedor de inicio, que restaura los primeros 3 FD que se guardaron en 1000 y superiores-ex r
inicia el programa usando elexec-wrapper
--args "$@"
pasa los argumentos como dados¿No fue fácil?
fuente