GDB - Debugging-Programme
Erste Schritte: Starten und Stoppen
gcc -g myprogram.c
Kompiliert myprogram.c mit der Debugging-Option (-g). Sie erhalten immer noch ein a.out, aber es enthält Debugging-Informationen, mit denen Sie Variablen und Funktionsnamen in GDB anstelle von unformatierten Speicherorten verwenden können (kein Spaß).
gdb a.out
Öffnet GDB mit der Datei a.out, führt das Programm jedoch nicht aus. Sie sehen eine Eingabeaufforderung (gdb) - alle Beispiele stammen von dieser Eingabeaufforderung.
r
r arg1 arg2
r <Datei1
Drei Möglichkeiten zum Ausführen von "a.out", die zuvor geladen wurden. Sie können es direkt ausführen (r), Argumente übergeben (r arg1 arg2) oder eine Datei einspeisen. Normalerweise setzen Sie vor dem Ausführen Haltepunkte.
help
h Haltepunkte
Listet Hilfethemen auf (Hilfe) oder erhält Hilfe zu einem bestimmten Thema (h Haltepunkte). GDB ist gut dokumentiert.
q - Beenden Sie GDB
Code durchgehen
Mit Stepping können Sie den Pfad Ihres Programms verfolgen und den Code ermitteln, der abstürzt oder ungültige Eingaben zurückgibt.
l
l 50
Ich meine Funktion
Listet 10 Zeilen Quellcode für die aktuelle Zeile (l), eine bestimmte Zeile (l 50) oder für eine Funktion (l myfunction) auf.
Nächster
Führt das Programm bis zur nächsten Zeile aus und hält dann an. Wenn die aktuelle Zeile eine Funktion ist, führt sie die gesamte Funktion aus und hält dann an.next ist gut, um schnell durch Ihren Code zu gehen.
Schritt
Führt die nächste Anweisung aus, nicht die Zeile. Wenn der aktuelle Befehl eine Variable setzt, ist dies derselbe wienext. Wenn es sich um eine Funktion handelt, springt sie in die Funktion, führt die erste Anweisung aus und hält dann an.step ist gut, um in die Details Ihres Codes einzutauchen.
Fertig
Beendet die Ausführung der aktuellen Funktion und hält dann an (auch als Ausstieg bezeichnet). Nützlich, wenn Sie versehentlich eine Funktion betreten haben.
Haltepunkte oder Überwachungspunkte
Haltepunkte spielen beim Debuggen eine wichtige Rolle. Sie unterbrechen ein Programm, wenn es einen bestimmten Punkt erreicht. Sie können Variablen untersuchen und ändern und die Ausführung fortsetzen. Dies ist hilfreich, wenn ein Eingabefehler auftritt oder Eingaben getestet werden sollen.
Pause 45
meine Funktion unterbrechen
- Setzt einen Haltepunkt in Zeile 45 oder bei myfunction. Das Programm wird angehalten, wenn es den Haltepunkt erreicht.
beobachte x == 3
Legt einen Überwachungspunkt fest, der das Programm anhält, wenn sich eine Bedingung ändert (wenn sich x == 3 ändert). Watchpoints eignen sich hervorragend für bestimmte Eingaben (myPtr! = NULL), ohne dass bei jedem Funktionsaufruf eine Unterbrechung erforderlich ist .
fortsetzen
Setzt die Ausführung fort, nachdem sie von einem Haltepunkt / Überwachungspunkt angehalten wurde. Das Programm wird fortgesetzt, bis es den nächsten Haltepunkt / Überwachungspunkt erreicht.
lösche N.
- Löscht den Haltepunkt N (Haltepunkte werden beim Erstellen nummeriert).
Variablen einstellen
Das Anzeigen und Ändern von Variablen zur Laufzeit ist ein wichtiger Bestandteil des Debuggens. Versuchen Sie, ungültige Eingaben für Funktionen bereitzustellen oder andere Testfälle auszuführen, um die Hauptursache für Probleme zu finden. In der Regel werden Variablen angezeigt / festgelegt, wenn das Programm angehalten wird.
x drucken
Druckt den aktuellen Wert der Variablen x. Um die ursprünglichen Variablennamen verwenden zu können, wird das Flag (-g) benötigt. Bei regelmäßig kompilierten Programmen werden diese Informationen entfernt.
setze x = 3
setze x = y
- Setzt x auf einen festgelegten Wert (3) oder auf eine andere Variable (y)
rufe myfunction () auf
rufe myotherfunction (x) auf
nenne strlen (mystring)
Ruft benutzerdefinierte oder Systemfunktionen auf. Dies ist äußerst nützlich, aber achten Sie darauf, keine fehlerhaften Funktionen aufzurufen.
Anzeige x
Zeigt ständig den Wert der Variablen x an, der nach jedem Schritt oder jeder Pause angezeigt wird. Nützlich, wenn Sie ständig nach einem bestimmten Wert suchen.
undisplay x
- Entfernt die konstante Anzeige einer Variablen, die vom Anzeigebefehl angezeigt wird.
Rückverfolgung und Ändern von Frames
Ein Stack ist eine Liste der aktuellen Funktionsaufrufe - er zeigt Ihnen, wo Sie sich im Programm befinden. Ein Frame speichert die Details eines einzelnen Funktionsaufrufs, z. B. die Argumente.
bt
Backtracesoder druckt den aktuellen Funktionsstapel, um anzuzeigen, wo Sie sich im aktuellen Programm befinden. Wenn Hauptaufrufe a () funktionieren, die b () aufrufen, die c () aufrufen, ist die Rückverfolgung
c <= current location
b
a
main
up
Nieder
Gehen Sie im Funktionsstapel zum nächsten Frame nach oben oder unten. Wenn Sie in sindc, Sie können zu bewegen b oder a lokale Variablen zu untersuchen.
Rückkehr
- Gibt von der aktuellen Funktion zurück.
Umgang mit Signalen
Signale sind Nachrichten, die nach bestimmten Ereignissen wie einem Timer oder einem Fehler ausgelöst werden. GDB kann pausieren, wenn ein Signal auftritt. Vielleicht möchten Sie sie stattdessen ignorieren.
handle [signalname] [action]
Griff SIGUSR1 Nostop
Griff SIGUSR1 Noprint
Handle SIGUSR1 ignorieren
Weisen Sie GDB an, ein bestimmtes Signal (SIGUSR1) zu ignorieren, wenn es auftritt. Es gibt verschiedene Ebenen des Ignorierens.