HOWTO · Bash

Comment exécuter GDB dans un script Bash

Compilez un programme C avec les symboles de débogage, exécutez-le sous GDB depuis Bash, transmettez les arguments du programme et automatisez les commandes de débogage.

Sur cette page

Pour exécuter un programme sous GDB depuis Bash, invoquez gdb avec --args, suivi de l’exécutable et de ses arguments. Ajoutez -ex run lorsque le script doit démarrer le programme automatiquement ; sans cela, GDB ouvre son invite et attend des commandes. Ce guide prépare un petit programme C, construit la commande en toute sécurité et présente les flux de travail interactif, avec points d’arrêt et avec fichier de commandes. L’environnement d’exécution fourni pour cet article n’inclut pas GDB ; les commandes du débogueur ci-dessous sont donc documentées, mais ne sont pas présentées comme une sortie exécutée.

Préparer un programme pour GDB

L’exemple ci-dessous écrit un petit programme C dans un répertoire temporaire, le compile avec l’option -g de GCC, puis l’exécute avec un argument. Les symboles de débogage permettent à GDB d’associer les instructions machine aux lignes de code source et aux variables. Les fichiers temporaires sont supprimés à la fin du script.

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

L’exécutable accepte une valeur facultative ; ici, hello est affiché. Utilisez le même chemin d’exécutable et le même argument après --args lorsque vous démarrez GDB. Les commandes GDB ci-dessous requièrent GDB et l’exécutable compilé sur la machine qui les exécute.

Exécuter GDB depuis un script Bash

Un script Bash peut stocker l’exécutable et les arguments dans des variables, puis les transmettre après --args. L’exemple précédent affiche un aperçu de la commande assemblée sans exiger que GDB soit installé. Pour démarrer une vraie session de débogage depuis un script, utilisez gdb --quiet -ex run --args "$program" "$argument". L’option --quiet supprime le message d’introduction de GDB, tandis que -ex exécute la commande GDB qui suit. -ex run démarre le programme ; l’omettre démarre GDB à l’invite (gdb). Pour interagir, omettez -ex run et tapez run à cette invite. Placez les expansions de variables entre guillemets afin que les arguments contenant des espaces restent un seul argument. Ces invocations du débogueur requièrent GDB et l’exécutable example compilé sur la machine qui exécute le script.

Définir des points d’arrêt et inspecter l’exécution

Pour faire une pause lorsque le programme entre dans main, ajoutez -ex 'break main' avant -ex run, par exemple : gdb --quiet -ex 'break main' -ex run --args ./example hello. GDB s’arrête au point d’arrêt avant d’exécuter le corps de main. À l’invite, inspectez les arguments avec print argc et print argv[1], puis continuez avec continue. La commande bt affiche la pile d’appels actuelle ; elle est utile pendant que l’exécution est en pause, par exemple à un point d’arrêt ou après un plantage. Une exécution normale déjà terminée n’a aucune pile d’appels active à inspecter.

Automatiser GDB avec un fichier de commandes

Pour des étapes de débogage répétables, placez les commandes GDB dans un fichier texte brut nommé gdb_commands.txt :

break main

run

print argc

Chargez ce fichier avec gdb --quiet -x gdb_commands.txt --args ./example hello. GDB traite les commandes listées dans l’ordre : il s’arrête à main, exécute le programme, puis affiche argc. Utilisez -ex pour une courte séquence de commandes intégrée à un script Bash ; utilisez -x lorsque vous conservez une séquence plus longue ou réutilisable dans son propre fichier. Le fichier de commandes contient des commandes GDB, tandis que --args fournit l’exécutable et les arguments du programme.