GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie man ein C-Programm mit gdb in 6 einfachen Schritten debuggt

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

gdb-Befehlsverknüpfungen

Verwenden Sie die folgenden Abkürzungen für die meisten häufigen gdb-Operationen.

  • l – Liste
  • p – drucken
  • c – weiter
  • s – Schritt
  • ENTER:Durch Drücken der Eingabetaste wird der zuvor ausgeführte Befehl erneut ausgeführt.

Verschiedene gdb-Befehle

  • l-Befehl: Verwenden Sie den gdb-Befehl l oder list, um den Quellcode im Debug-Modus auszudrucken. Verwenden Sie l line-number, um eine bestimmte Zeilennummer anzuzeigen (oder) l function, um eine bestimmte Funktion anzuzeigen.
  • bt:zurück – Backtrace aller Stackframes oder der innersten COUNT Frames drucken.
  • Hilfe – Hilfe für ein bestimmtes gdb-Thema anzeigen — help TOPICNAME.
  • beenden – Verlassen Sie den gdb-Debugger.

Linux
  1. Debuggen Sie Linux mit ProcDump

  2. Wie man C-Programme unter Linux mit gdb debuggt

  3. So erstellen Sie Linux-Proc-Dateien im C-Programm mit LKM

  4. So aktivieren Sie die NFS-Debug-Protokollierung mit rpcdebug

  5. Wie setze ich die Umgebungsvariable in GDB mit dem Shell-Befehl?

Wie man GNOME Shell 3.16 thematisiert (in fünf einfachen Schritten)

So verfolgen Sie die Programmausführung mit dem Linux-Strace-Befehl

So kompilieren Sie C, C++ und Java mit Terminal unter Linux

So verwenden Sie GDB zum Debuggen von Programmen in Ubuntu 20.04

So erstellen Sie Kurventext in GIMP in 5 einfachen Schritten [GIMP-Anfänger-Tutorial]

Ubuntu-Tipps:So verwalten Sie einfache Projekte mit Tomboy Notes