Suche…


Bemerkungen

GDB (GNU Project-Debugger) ist ein Befehlszeilen-Basis-Debugger, der sich gut zur Analyse laufender und korrelierter Programme eignet. Entsprechend dem Benutzerhandbuch unterstützt GDB C, C ++, D, Go, Objective-C, Fortran, Java, OpenCL C, Pascal, Rust, Assembly, Modula-2 und Ada.

GDB verfügt über die gleichen Funktionen wie die meisten Debugger, unterscheidet sich jedoch von den meisten, die ich verwendet habe. Alle basieren auf der Eingabe von Befehlen, statt auf GUI-Elemente zu klicken. Einige dieser Funktionen umfassen:

  • Haltepunkte setzen
  • Den Wert von Variablen drucken.
  • Festlegen des Werts von Variablen zum Testen.
  • Stapel ansehen

Was ist GDB?

GDB, kurz für GNU Debugger, ist der beliebteste Debugger für UNIX-Systeme, um C- und C ++ - Programme zu debuggen. Der GNU-Debugger, der auch als gdb bezeichnet wird, ist der beliebteste Debugger für UNIX-Systeme zum Debuggen von C- und C ++ - Programmen.

GNU Debugger hilft Ihnen, Informationen zu folgenden Themen zu erhalten:

  • Wenn ein Core-Dump aufgetreten ist, mit welcher Anweisung oder welchem ​​Ausdruck stürzte das Programm ab?

  • Wenn bei der Ausführung einer Funktion ein Fehler auftritt, in welcher Zeile der
    Programm enthält den Aufruf dieser Funktion, und was sind die
    Parameter?

  • Was sind die Werte von Programmvariablen zu einem bestimmten Zeitpunkt während der Ausführung des Programms?

  • Was ist das Ergebnis eines bestimmten Ausdrucks in einem Programm?

Starten von GDB

Um GDB im Terminal zu starten,

gdb <executable name>

Für das obige Beispiel mit einem Programm namens main wird der Befehl

gdb main

Haltepunkte setzen

Wahrscheinlich möchten Sie, dass Ihr Programm an einem bestimmten Punkt stoppt, damit Sie den Zustand Ihres Programms überprüfen können. Die Zeile, an der das Programm vorübergehend angehalten werden soll, wird als Haltepunkt bezeichnet.

break <source code line number>

Programm ausführen

Um Ihr Programm auszuführen, lautet der Befehl, wie Sie vermuteten,

run

Kern öffnen

gdb -c coreFile pathToExecutable  

Mit einer Core-Datei arbeiten

Erstellt dieses wirklich schlechte Programm

 #include <stdio.h>
 #include <ctype.h>

// forward declarations


void bad_function()
{

   int *test = 5;

   free(test);

}


int main(int argc, char *argv[])
{
   bad_function();
   return 0;
}


gcc -g ex1.c

./a.out   //or whatever gcc creates
Segmentation fault (core dumped)

gdb -c core a.out

Core was generated by `./a.out'.

Programm beendet mit Signal SIGSEGV, Segmentierungsfehler. # 0 __GI___libc_free (mem = 0x5) bei malloc.c: 2929 2929 malloc.c: Keine solche Datei oder Verzeichnis.

(gdb) where

# 0 __GI___libc_free (mem = 0x5) bei malloc.c: 2929 # 1 0x0000000000400549 in bad_function () bei ex1.c: 12 # 2 0x0000000000400564 in main (argc = 1, argv = 0x7fffb825bd68) bei ex1.c: 19

Seit ich mit -g kompiliert habe, kann man sehen, dass der Aufruf wo sagt, dass der Code in Zeile 12 von bad_function () nicht gefallen hat.

Dann kann ich die Testvariable untersuchen, die ich versucht habe zu befreien

(gdb) up

# 1 0x0000000000400549 in bad_function () bei ex1.c: 12 12 frei (Test);

(gdb) print test

$ 1 = (int *) 0x5

(gdb) print *test

Kann nicht auf Speicher unter Adresse 0x5 zugreifen

In diesem Fall ist der Fehler ziemlich offensichtlich. Ich habe versucht, einen Zeiger freizugeben, der gerade die Adresse 5 zugewiesen hat, die nicht von malloc erstellt wurde. Free hat also keine Ahnung, was damit zu tun ist.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow