GDB - Kurzanleitung
Ein Debugger ist ein Programm, das andere Programme ausführt, sodass der Benutzer die Kontrolle über diese Programme ausüben und Variablen untersuchen kann, wenn Probleme auftreten.
GNU Debugger, der auch genannt wird gdb, ist der beliebteste Debugger für UNIX-Systeme zum Debuggen von C- und C ++ - Programmen.
GNU Debugger hilft Ihnen dabei, Informationen über Folgendes zu erhalten:
Wenn ein Core-Dump passiert ist, auf welche Anweisung oder welchen Ausdruck ist das Programm dann abgestürzt?
Wenn beim Ausführen einer Funktion ein Fehler auftritt, welche Programmzeile enthält den Aufruf dieser Funktion und welche Parameter gibt es?
Was sind die Werte von Programmvariablen an einem bestimmten Punkt während der Ausführung des Programms?
Was ist das Ergebnis eines bestimmten Ausdrucks in einem Programm?
Wie debuggt GDB?
Mit GDB können Sie das Programm bis zu einem bestimmten Punkt ausführen, dann die Werte bestimmter Variablen an diesem Punkt anhalten und ausdrucken oder zeilenweise durch das Programm gehen und die Werte jeder Variablen nach Ausführung jeder Zeile ausdrucken.
GDB verwendet eine einfache Befehlszeilenschnittstelle.
Zu beachtende Punkte
GDB kann Ihnen zwar dabei helfen, Fehler im Zusammenhang mit Speicherverlusten herauszufinden, ist jedoch kein Tool zum Erkennen von Speicherverlusten.
GDB kann nicht für Programme verwendet werden, die mit Fehlern kompiliert werden, und es hilft nicht, diese Fehler zu beheben.
Überprüfen Sie vor der Installation, ob gdb bereits auf Ihrem Unix-System installiert ist, indem Sie den folgenden Befehl ausführen:
$gdb -help
Wenn GDB installiert ist, werden alle verfügbaren Optionen in Ihrer GDB angezeigt. Wenn GDB nicht installiert ist, fahren Sie mit einer Neuinstallation fort.
Sie können GDB auf Ihrem System installieren, indem Sie die folgenden einfachen Schritte ausführen.
step 1: Stellen Sie sicher, dass Sie die Voraussetzungen für die Installation von gdb haben:
Ein ANSI-kompatibler C-Compiler (gcc wird empfohlen - beachten Sie, dass gdb von anderen Compilern generierte Codes debuggen kann)
Auf der Partition, auf der Sie gdb erstellen möchten, sind 115 MB freier Speicherplatz erforderlich.
Auf der Partition, auf der Sie gdb installieren möchten, sind 20 MB freier Speicherplatz erforderlich.
Dekompressionsprogramm der GNU, gzip
Das make Dienstprogramm - Die GNU-Version funktioniert bekanntermaßen problemlos, andere wahrscheinlich auch.
step 2: Laden Sie die GDB-Quelldistribution von herunter ftp.gnu.org/gnu/gdb. (Wir verwendeten gdb-6.6.tar.gz für diese Anweisungen.) Legen Sie die Verteilungsdateien in Ihrem Build-Verzeichnis ab.
step 3:Dekomprimieren Sie in Ihrem Build-Verzeichnis gdb-6.6.tar.gz und extrahieren Sie die Quelldateien aus dem Archiv. Ändern Sie nach dem Extrahieren der Dateien Ihr Arbeitsverzeichnis in das Verzeichnis gdb-6.6, das automatisch in Ihrem Erstellungsverzeichnis erstellt wurde.
$ build> gzip -d gdb-6.6.tar.gz
$ build> tar xfv gdb-6.6.tar
$ build> cd gdb-6.6
step 4: Führen Sie das Konfigurationsskript aus, um den Quellbaum für Ihre Plattform zu konfigurieren.
$ gdb-6.6> .⁄configure
step 5: Erstellen Sie gdb mit dem make Nützlichkeit.
$ gdb-6.6> make
step 6: Melden Sie sich als root an und installieren Sie gdb mit dem folgenden Befehl.
$ gdb-6.6> make install
step 7: Bei Bedarf kann Speicherplatz durch Löschen des GDB-Erstellungsverzeichnisses und der Archivdatei nach Abschluss der Installation wiederhergestellt werden.
$ gdb-6.6> cd ..
$ build> rm -r gdb-6.6
$ build> rm gdb-6.6.tar
Sie haben jetzt gdb auf Ihrem System installiert und es ist einsatzbereit.
EIN Debugging Symbol TableOrdnet Anweisungen im kompilierten Binärprogramm der entsprechenden Variablen, Funktion oder Zeile im Quellcode zu. Diese Zuordnung könnte ungefähr so aussehen:
Programmanweisung ⇒ Artikelname, Artikeltyp, Originaldatei, Zeilennummer definiert.
Symboltabellen können in das Programm eingebettet oder als separate Datei gespeichert werden. Wenn Sie also planen, Ihr Programm zu debuggen, müssen Sie eine Symboltabelle erstellen, die die erforderlichen Informationen zum Debuggen des Programms enthält.
Wir können die folgenden Fakten über Symboltabellen ableiten:
Eine Symboltabelle funktioniert für eine bestimmte Version des Programms. Wenn sich das Programm ändert, muss eine neue Tabelle erstellt werden.
Debug-Builds sind häufig größer und langsamer als Einzelhandels-Builds (ohne Debug). Debug-Builds enthalten die Symboltabelle und andere Zusatzinformationen.
Wenn Sie ein Binärprogramm debuggen möchten, das Sie nicht selbst kompiliert haben, müssen Sie die Symboltabellen vom Autor erhalten.
Damit GDB all diese Informationen Zeile für Zeile aus der Symboltabelle lesen kann, müssen wir sie etwas anders kompilieren. Normalerweise kompilieren wir unsere Programme wie folgt:
gcc hello.cc -o hello
Stattdessen müssen wir wie unten gezeigt mit dem Flag -g kompilieren:
gcc -g hello.cc -o hello
GDB bietet eine große Liste von Befehlen, jedoch werden die folgenden Befehle am häufigsten verwendet:
b main - Setzt einen Haltepunkt am Anfang des Programms
b - Setzt einen Haltepunkt in die aktuelle Zeile
b N - Setzt einen Haltepunkt in Zeile N.
b +N - Setzt einen Haltepunkt N Zeilen von der aktuellen Zeile ab
b fn - Setzt einen Haltepunkt am Anfang der Funktion "fn"
d N - Löscht die Haltepunktnummer N.
info break - Haltepunkte auflisten
r - Führt das Programm bis zu einem Haltepunkt oder Fehler aus
c - Das Programm wird bis zum nächsten Haltepunkt oder Fehler fortgesetzt
f - Läuft, bis die aktuelle Funktion beendet ist
s - Führt die nächste Zeile des Programms aus
s N - Führt die nächsten N Zeilen des Programms aus
n - Wie s, aber es tritt nicht in Funktionen ein
u N - Läuft, bis Sie N Zeilen vor der aktuellen Zeile erhalten
p var - Druckt den aktuellen Wert der Variablen "var"
bt - Druckt eine Stapelverfolgung
u - Steigt eine Ebene im Stapel auf
d - Geht eine Ebene im Stapel runter
q - Beendet gdb
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 - GDB beenden
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 die aktuelle 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.
Sehen Sie sich die folgenden Beispiele an, um zu verstehen, wie ein Programm und ein Core-Dump debuggt werden.
Debugging-Beispiel 1
Dieses Beispiel zeigt, wie Sie einen Fehler erfassen, der aufgrund einer Ausnahme auftritt, die beim Teilen durch Null ausgelöst wird.
Debugging-Beispiel 2
Dieses Beispiel zeigt ein Programm, das einen Kern aufgrund nicht initialisierten Speichers sichern kann.
Beide Programme sind in C ++ geschrieben und generieren aus verschiedenen Gründen einen Core Dump. Nachdem Sie diese beiden Beispiele durchgearbeitet haben, sollten Sie in der Lage sein, Ihre C- oder C ++ - Programme zu debuggen, die Core-Dumps generieren.
Nachdem Sie dieses Tutorial durchgearbeitet haben, müssen Sie ein gutes Verständnis für das Debuggen eines C- oder C ++ - Programms mit GNU Debugger erworben haben. Jetzt sollte es für Sie sehr einfach sein, die Funktionen anderer Debugger zu erlernen, da diese GDB sehr ähnlich sind. Es wird dringend empfohlen, auch andere Debugger zu verwenden, um sich mit deren Funktionen vertraut zu machen.
Es gibt einige gute Debugger auf dem Markt:
DBX Debugger- Dieser Debugger wird zusammen mit Sun Solaris ausgeliefert. Auf der Manpage von dbx, dh man dbx, können Sie vollständige Informationen zu diesem Debugger abrufen .
DDD Debugger- Dies ist eine grafische Version von dbx und unter Linux frei verfügbar. Verwenden Sie die Manpage von ddd, dh man ddd, um ein vollständiges Detail zu erhalten .
Ein umfassendes Detail zum GNU-Debugger erhalten Sie unter folgendem Link: Debuggen mit GDB