Zuvor haben wir die Grundlagen zum Schreiben und Kompilieren eines C-Programms mit dem C-Hello-World-Programm besprochen.
Lassen Sie uns in diesem Artikel diskutieren, wie man ein C-Programm mit dem gdb Debugger in 6 einfachen Schritten debuggt.
Schreiben Sie ein Beispiel-C-Programm mit Fehlern für Debugging-Zwecke
Um das Debuggen von C-Programmen zu lernen, erstellen wir das folgende C-Programm, das die Fakultät einer Zahl berechnet und ausgibt. Dieses C-Programm enthält jedoch einige Fehler für unsere Debugging-Zwecke.
$ vim factorial.c # include <stdio.h> int main() { int i, num, j; printf ("Enter the number: "); scanf ("%d", &num ); for (i=1; i<num; i++) j=j*i; printf("The factorial of %d is %d\n",num,j); }
$ cc factorial.c $ ./a.out Enter the number: 3 The factorial of 3 is 12548672
Lassen Sie es uns debuggen, während wir uns die nützlichsten Befehle in gdb ansehen.
Schritt 1. Kompilieren Sie das C-Programm mit der Debugging-Option -g
Kompilieren Sie Ihr C-Programm mit der Option -g. Dadurch kann der Compiler die Debugging-Informationen sammeln.
$ cc -g factorial.c
Hinweis:Der obige Befehl erstellt eine.out-Datei, die wie unten gezeigt zum Debuggen verwendet wird.
Schritt 2. gdb starten
Starten Sie den C-Debugger (gdb) wie unten gezeigt.
$ gdb a.out
Schritt 3. Richten Sie einen Unterbrechungspunkt im C-Programm ein
Syntax: break line_number
Andere Formate:
- break [Dateiname]:Zeilennummer
- break [Dateiname]:Funktionsname
Setzt Haltepunkt im C-Programm, wo Sie Fehler vermuten. Während der Ausführung des Programms hält der Debugger am Unterbrechungspunkt an und gibt Ihnen die Aufforderung zum Debuggen.
Bevor wir also das Programm starten, lassen Sie uns den folgenden Haltepunkt in unser Programm einfügen.
break 10 Breakpoint 1 at 0x804846f: file factorial.c, line 10.
Schritt 4. Führen Sie das C-Programm im gdb-Debugger aus
run [args]
Sie können das Programm mit dem Befehl run im gdb-Debugger starten. Sie können dem Programm auch Kommandozeilenargumente über run args übergeben. Das Beispielprogramm, das wir hier verwendet haben, erfordert keine Befehlszeilenargumente, also geben wir run und starten die Programmausführung.
run Starting program: /home/sathiyamoorthy/Debugging/c/a.out
Sobald Sie das C-Programm ausgeführt haben, würde es bis zum ersten Unterbrechungspunkt ausgeführt und Ihnen die Eingabeaufforderung zum Debuggen geben.
Breakpoint 1, main () at factorial.c:10 10 j=j*i;
Sie können verschiedene gdb-Befehle verwenden, um das C-Programm zu debuggen, wie in den folgenden Abschnitten erklärt.
Schritt 5. Drucken der Variablenwerte im gdb-Debugger
Syntax: print {variable} Examples: print i print j print num
(gdb) p i $1 = 1 (gdb) p j $2 = 3042592 (gdb) p num $3 = 3 (gdb)
Wie Sie oben sehen, haben wir in factorial.c die Variable j nicht initialisiert. Es erhält also einen Müllwert, was zu großen Zahlen als Fakultätswerte führt.
Beheben Sie dieses Problem, indem Sie die Variable j mit 1 initialisieren, das C-Programm kompilieren und erneut ausführen.
Auch nach diesem Fix scheint es ein Problem im Programm factorial.c zu geben, da es immer noch einen falschen Fakultätswert ausgibt.
Platzieren Sie also den Haltepunkt in der 10. Zeile und fahren Sie fort, wie im nächsten Abschnitt beschrieben.
Schritt 6. Fahren Sie fort, gehen Sie über und in – gdb-Befehle
Es gibt drei Arten von gdb-Operationen, die Sie auswählen können, wenn das Programm an einem Haltepunkt stoppt. Sie werden bis zum nächsten Unterbrechungspunkt fortgesetzt, springen ein oder überspringen die nächsten Programmzeilen.
- c oder Continue:Der Debugger wird bis zum nächsten Haltepunkt weiter ausgeführt.
- n oder next:Debugger führt die nächste Zeile als einzelne Anweisung aus.
- s oder step:Dasselbe wie next, aber behandelt die Funktion nicht als einzelne Anweisung, sondern geht stattdessen in die Funktion und führt sie Zeile für Zeile aus.
Wenn Sie fortfahren oder durchgehen, haben Sie möglicherweise festgestellt, dass das Problem darin besteht, dass wir das <=nicht in der Bedingungsprüfung der „for-Schleife“ verwendet haben. Wenn Sie das also von
Verwenden Sie die folgenden Abkürzungen für die meisten häufigen gdb-Operationen.gdb-Befehlsverknüpfungen
Verschiedene gdb-Befehle