HOWTO · Bash
GDB in einem Bash-Skript ausführen
Kompilieren Sie ein C-Programm mit Debug-Symbolen, führen Sie es aus Bash heraus unter GDB aus, übergeben Sie Programmargumente und automatisieren Sie Debugger-Befehle.
Auf dieser Seite
Um ein Programm aus Bash heraus unter GDB auszuführen, rufen Sie gdb mit --args auf, gefolgt von der ausführbaren Datei und ihren Argumenten. Fügen Sie -ex run hinzu, wenn das Skript das Programm automatisch starten soll; ohne diese Option öffnet GDB seine Eingabeaufforderung und wartet auf Befehle. Diese Anleitung erstellt ein kleines C-Programm, baut den Befehl sicher zusammen und zeigt interaktive Arbeitsabläufe sowie solche mit Haltepunkten und Befehlsdateien. Die für diesen Artikel bereitgestellte Laufzeitumgebung enthält kein GDB, daher sind die folgenden Debugger-Befehle dokumentiert, werden aber nicht als ausgeführte Ausgabe dargestellt.
Ein Programm für GDB vorbereiten
Das folgende Beispiel schreibt ein kleines C-Programm in ein temporäres Verzeichnis, kompiliert es mit der GCC-Option -g und führt es dann mit einem Argument aus. Die Debug-Symbole ermöglichen es GDB, Maschinenanweisungen den Quellzeilen und Variablen zuzuordnen. Die temporären Dateien werden entfernt, wenn das Skript endet.
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
Die ausführbare Datei akzeptiert einen optionalen Wert; hier wird hello ausgegeben. Verwenden Sie beim Starten von GDB denselben Pfad zur ausführbaren Datei und dasselbe Argument nach --args. Die folgenden GDB-Befehle erfordern GDB und die kompilierte ausführbare Datei auf dem Rechner, auf dem sie ausgeführt werden.
GDB aus einem Bash-Skript ausführen
Ein Bash-Skript kann die ausführbare Datei und die Argumente in Variablen speichern und sie dann nach --args übergeben. Das vorherige Beispiel zeigt den zusammengesetzten Befehl als Vorschau, ohne dass GDB installiert sein muss. Um eine echte Debug-Sitzung aus einem Skript zu starten, verwenden Sie gdb --quiet -ex run --args "$program" "$argument". Die Option --quiet unterdrückt die Einführungsmeldung von GDB, während -ex den folgenden GDB-Befehl ausführt. -ex run startet das Programm; wird es weggelassen, startet GDB an der Eingabeaufforderung (gdb). Um zu interagieren, lassen Sie -ex run weg und geben Sie an dieser Eingabeaufforderung run ein. Setzen Sie Variablenexpansionen in Anführungszeichen, damit Argumente mit Leerzeichen ein einziges Argument bleiben. Diese Debugger-Aufrufe erfordern GDB und die kompilierte ausführbare Datei example auf dem Rechner, auf dem das Skript läuft.
Haltepunkte setzen und die Ausführung untersuchen
Um anzuhalten, wenn das Programm main betritt, fügen Sie -ex 'break main' vor -ex run hinzu, zum Beispiel: gdb --quiet -ex 'break main' -ex run --args ./example hello. GDB hält am Haltepunkt an, bevor der Rumpf von main ausgeführt wird. Untersuchen Sie an der Eingabeaufforderung die Argumente mit print argc und print argv[1] und fahren Sie dann mit continue fort. Der Befehl bt gibt den aktuellen Aufrufstapel aus; er ist nützlich, solange die Ausführung angehalten ist, etwa an einem Haltepunkt oder nach einem Absturz. Ein normaler Lauf, der bereits beendet ist, hat keinen aktiven Aufrufstapel, den man untersuchen könnte.
GDB mit einer Befehlsdatei automatisieren
Für wiederholbare Debugger-Schritte legen Sie die GDB-Befehle in einer Nur-Text-Datei namens gdb_commands.txt ab:
break main
run
print argc
Laden Sie diese Datei mit gdb --quiet -x gdb_commands.txt --args ./example hello. GDB verarbeitet die aufgelisteten Befehle der Reihe nach: Es hält bei main an, führt das Programm aus und gibt dann argc aus. Verwenden Sie -ex für eine kurze Befehlsfolge, die in ein Bash-Skript eingebettet ist; verwenden Sie -x, wenn eine längere oder wiederverwendbare Folge in einer eigenen Datei steht. Die Befehlsdatei enthält GDB-Befehle, während --args die ausführbare Datei und die Argumente des Programms liefert.