HOWTO · Bash
Cómo ejecutar GDB en un script de Bash
Compile un programa en C con símbolos de depuración, ejecútelo con GDB desde Bash, pase argumentos del programa y automatice los comandos de depuración.
En esta página
Para ejecutar un programa con GDB desde Bash, invoque gdb con --args, seguido del ejecutable y sus argumentos. Agregue -ex run cuando el script deba iniciar el programa automáticamente; sin él, GDB abre su indicador y espera comandos. Esta guía prepara un pequeño programa en C, construye el comando de forma segura y muestra flujos de trabajo interactivos, con puntos de interrupción y con archivos de comandos. El entorno de ejecución proporcionado para este artículo no incluye GDB, por lo que los comandos del depurador siguientes están documentados, pero no se presentan como salida ejecutada.
Preparar un programa para GDB
El ejemplo siguiente escribe un pequeño programa en C en un directorio temporal, lo compila con la opción -g de GCC y luego lo ejecuta con un argumento. Los símbolos de depuración permiten a GDB asociar las instrucciones de máquina con las líneas de código fuente y las variables. Los archivos temporales se eliminan cuando el script termina.
set -eu
workdir=$(mktemp -d)
trap 'rm -rf "$workdir"' EXIT
cat > "$workdir/example.c" <<'C'
#include <stdio.h>
int main(int argc, char **argv) {
if (argc > 1) {
printf("Argument: %s\n", argv[1]);
}
return 0;
}
C
gcc -g -o "$workdir/example" "$workdir/example.c"
cd "$workdir"
program=./example
"$program" hello
printf 'gdb --quiet -ex run --args %s hello\n' "$program"
Argument: hello
gdb --quiet -ex run --args ./example hello
El ejecutable acepta un valor opcional; aquí se imprime hello. Utilice la misma ruta del ejecutable y el mismo argumento después de --args al iniciar GDB. Los comandos de GDB siguientes requieren GDB y el ejecutable compilado en la máquina que los ejecuta.
Ejecutar GDB desde un script de Bash
Un script de Bash puede almacenar el ejecutable y los argumentos en variables y luego pasarlos después de --args. El ejemplo anterior muestra una vista previa del comando ensamblado sin necesidad de que GDB esté instalado. Para iniciar una sesión de depuración real desde un script, utilice gdb --quiet -ex run --args "$program" "$argument". La opción --quiet suprime el mensaje introductorio de GDB, mientras que -ex ejecuta el comando de GDB que le sigue. -ex run inicia el programa; omitirlo inicia GDB en el indicador (gdb). Para interactuar, omita -ex run y escriba run en ese indicador. Ponga las expansiones de variables entre comillas para que los argumentos que contienen espacios sigan siendo un solo argumento. Estas invocaciones del depurador requieren GDB y el ejecutable example compilado en la máquina que ejecuta el script.
Establecer puntos de interrupción e inspeccionar la ejecución
Para hacer una pausa cuando el programa entra en main, agregue -ex 'break main' antes de -ex run, por ejemplo: gdb --quiet -ex 'break main' -ex run --args ./example hello. GDB se detiene en el punto de interrupción antes de ejecutar el cuerpo de main. En el indicador, inspeccione los argumentos con print argc y print argv[1], y luego continúe con continue. El comando bt imprime la pila de llamadas actual; resulta útil mientras la ejecución está en pausa, como en un punto de interrupción o después de un fallo. Una ejecución normal que ya ha terminado no tiene ninguna pila de llamadas activa que inspeccionar.
Automatizar GDB con un archivo de comandos
Para pasos de depuración repetibles, coloque los comandos de GDB en un archivo de texto sin formato llamado gdb_commands.txt:
break main
run
print argc
Cargue ese archivo con gdb --quiet -x gdb_commands.txt --args ./example hello. GDB procesa los comandos listados en orden: se detiene en main, ejecuta el programa y luego imprime argc. Utilice -ex para una secuencia corta de comandos incrustada en un script de Bash; utilice -x cuando mantenga una secuencia más larga o reutilizable en su propio archivo. El archivo de comandos contiene comandos de GDB, mientras que --args suministra el ejecutable y los argumentos del programa.