So verwenden Sie den GNU-Debugger unter Linux

GNU Debugger wird verwendet, um ein Programm zu debuggen, einen Absturz zu analysieren oder zu sehen, was das Programm an einem bestimmten Punkt macht. Es wurde in den 1980er Jahren vom GNU-Projekt entwickelt und ist einer der am weitesten verbreiteten Befehlszeilen-Debugger sowie eine der beliebtesten GNU-Software.

Schreiben wir zunächst ein kleines C-Programm, das wir dann debuggen. Um zu beginnen, erstellen Sie ein neues .C Datei mit vim oder ein Editor Ihrer Wahl:

vim test.c

Erstellen Sie das folgende C-Programm:

#include int main() { int i = 5; Schwimmer f = 5,5 i = i + 3; f = f + 2,2; printf("Werte von i und f sind: %d und %f\n", i, f); 0 zurückgeben; }

Drücken Sie Flucht um in den vim-Befehlsmodus zu wechseln. Dann tippe :wq um das Programm zu speichern und zu beenden.

Kompilieren Sie und prüfen Sie, ob das Programm ausgeführt wird:

gcc test.c -o test ./test Wert von i und f sind: 8 und 7.700000

Um die Debug-Unterstützung in einem Programm zu aktivieren, wir kompilieren es mit -g Flagge. Wenn das Flag nicht verwendet wird, kann der Benutzer das Programm immer noch debuggen, wenn auch mit eingeschränkten Optionen.

gcc test.c -g -o test

Um mit dem Debuggen zu beginnen unsere ausführbare Datei Prüfung in gdb, wir rennen:

gdb-test

Es öffnet die gdb Konsole, wo Sie die eingeben können gdb Befehle. Um eine Liste von Befehlen anzuzeigen, verwenden Sie die Hilfe Befehl.

$(gdb) help Liste der Befehlsklassen: aliases -- Aliase anderer Befehle Haltepunkte -- Programm an bestimmten Punkten stoppen data -- Datendateien untersuchen -- Interne Dateien von Dateien spezifizieren und untersuchen -- Wartungsbefehle verschleiern -- Obskure Funktionen laufen -- Ausführen des Programm-Stack -- Untersuchen des Stack-Status -- Unterstützung von Statusabfragen -- Unterstützung von Tracepunkten -- Verfolgung der Programmausführung ohne das Programm anzuhalten benutzerdefiniert -- Benutzerdefinierte Befehle Geben Sie "help" gefolgt von einem Klassennamen ein für eine Liste der Befehle in dieser Klasse. Geben Sie "help all" ein, um die Liste aller Befehle anzuzeigen. Geben Sie "help" gefolgt vom Befehlsnamen ein, um eine vollständige Dokumentation zu erhalten. Geben Sie "apropos word" ein, um nach Befehlen zu suchen, die sich auf "word" beziehen. Abkürzungen für Befehlsnamen sind zulässig, wenn sie eindeutig sind.

Sie können dann eingeben hilfe class_name um Befehle zu sehen, die zu dieser Klasse gehören. Um Befehle mit einer Teilzeichenfolge zu suchen, verwenden Sie apropos Teilzeichenfolge.

Um einen Haltepunkt zu setzen, wenn das Programm eine Funktion eingibt, Lauf:

$(gdb) Hauptunterbrechung

Hier setzen wir einen Breakpoint an der einzigen Funktion in unserem Code, d.h. hauptsächlich. Verwenden Sie den Befehl Lauf um das Programm bis zum nächsten Haltepunkt oder bis zum Beenden auszuführen.

$(gdb) ausführen

Um einen Haltepunkt an einer bestimmten Stelle in einer Funktion zu setzen, benutzen:

Pause *Haupt + 4

Dadurch wird ein Breakpoint in der 4. Zeile der Funktion main eingerichtet.

Jetzt, um den Programmablauf zur nächsten Codezeile zu überspringen, einfach laufen lassen Schritt Befehl.

$(gdb) Schritt 5: float f = 5,5;

Um den Inhalt einer Variablen anzuzeigen, Lauf Anzeige .

$(gdb) Anzeige i 6: i = 5

Um den Inhalt einer Variablen zu ändern, die möglicherweise erforderlich ist, um den Ablauf eines Programms unter bestimmten Werten einer Variablen zu analysieren, run Variable setzen =Ausdruck.

$(gdb) setze Variable i=10 $(gdb) Anzeige i 7: i = 10

Hier kann der ‚Ausdruck‘ jeder gültige (arithmetische / logische) Ausdruck sein. Der Einfachheit halber weisen wir der Variablen einfach einen anderen Wert (10) zu ich.

Um den Assemblercode für das Programm zu drucken, Befehl verwenden Funktionsname zerlegen:

Verwenden Sie nur zerlegen um Assemblercode für das ganze Programm zu drucken. Beachten Sie den Pfeil an einer bestimmten Zeile im Assemblercode. Es zeigt an, dass die Debugging-Sitzung derzeit an dieser bestimmten Speicherstelle (d. h. dieser Codezeile) angehalten ist.

Um den Debugger an einer bestimmten Codezeile zu überspringen, Lauf:

$(gdb) jump *main + 2 Fortsetzung bei 0x400528. Breakpoint 2, 0x000000000040052a in main() at test.c:3 3 int main() { 1: i = 2: f = 3: h = (void *) 0x0 4: main = {int ()} 0x400526 5: i = 

Dadurch springt der Debugger an der Speicherstelle der 2. Codezeile in der Funktion hauptsächlich. Beachten Sie, dass ich hier vom Anfang des Hauptstandorts direkt zum zweiten Standort gesprungen bin. Daher variabel ich wurde nie gesetzt, was dazu führt, dass der Debugger den Fehler auslöst, dass er nicht auf den Speicherinhalt an der Adresse der Variablen zugreifen kann ich.

Dies sind einige der grundlegenden Befehle, die Ihnen den Einstieg in das Debuggen einer ausführbaren Datei unter Linux erleichtern können. Wir hoffen, Sie finden die Informationen auf dieser Seite hilfreich.