Finden Sie Bugs in Linux von GDB

Um zu verstehen, wie Sie Fehler in Linux finden können mit gDB, Sie müssen ein Beispiel zu sehen. Das Verfahren ist am einfachsten mit einem einfachen Beispiel zu zeigen, so dass die folgende, dbgtst.c, Programm ist eine erfundene, die einen typischen Fehler enthält.

# include static char buf [256] -Lücke READ_INPUT (char * s) -int main (void) {char * input = NULL- / * Nur ein Zeiger, kein Speicher für string * / READ_INPUT (Eingang) - / * Process-Befehl . * / Printf ( "Sie haben eingegeben:% s n", input) - / *. . ._ * / Return 0-} void READ_INPUT (char * s) {printf ( "Befehl:") -gets (en) -}

Dieser Hauptfunktion des Programms fordert der READ_INPUT Funktion eine Linie von Eingabe vom Benutzer zu erhalten. Das READ_INPUT Funktion erwartet ein Zeichen-Array, in dem es gibt, was die Benutzertypen. In diesem Beispiel jedoch, Main Anrufe READ_INPUT mit einem nicht initialisierten Zeiger - das ist der Fehler in diesem einfachen Programm.

Erstellen Sie das Programm mit gcc mit dem -G Option:

gcc -g -o dbgtst dbgtst.c

Ignorieren Sie die Warnmeldung über die wird Funktion ist Gefährlichkeit Sie versuchen, den Mangel dieser Funktion zu verwenden, um zu sehen, wie Sie verwenden können, gDB zu verfolgen Fehler nach unten.

Um das Problem mit diesem Programm zu sehen, führen Sie es und geben Sie Test Bei der Befehl: prompt:

./ DbgtstCommand: testSegmentation Fehler

Das Programm stirbt, nachdem die Anzeige Segmentation fault Nachricht. Für ein so kleines Programm wie dieses, können Sie wahrscheinlich die Ursache finden, indem Sie den Quellcode zu untersuchen. In einer Anwendung der realen Welt, aber Sie möglicherweise nicht sofort wissen, was den Fehler verursacht. Das ist, wenn Sie zu verwenden gDB die Ursache des Problems zu finden.

Benutzen gDB Ein Fehler wurde folgendermaßen vor, zu finden:

  1. Laden Sie das Programm unter gDB.

    Geben Sie beispielsweise gDB dbgtst ein Programm zu laden benannt dbgtst im gDB.

  2. Starten Sie das Programm ausgeführt wird unter gDB durch die Eingabe von Lauf Befehl. Wenn das Programm zur Eingabe auffordert, geben Sie einige Eingabetext.

    Das Programm schlägt fehl, wie es vorher war. Hier ist, was mit dem dbgtst Programm passiert:

    (GDB) LaufStartprogramm: / home / edulaney / swdev / dbgtstCommand: TestProgramm empfangene Signal SIGSEGV, Segmentation fault.0x400802b6 in gets () von /lib/tls/libc.so.6(gdb)
  3. Verwenden Sie die woher Befehl, um zu bestimmen, wo das Programm starben.

    Für das dbgtst Programm liefert dieser Befehl die folgende Ausgabe:

    (GDB), wobei # 0 0x400802b6 in gets () von /lib/tls/libc.so.6#1 0x08048474 in READ_INPUT (s = 0x0) bei dbgtst.c: 16 # 2 0x08048436 in main () bei dbgtst.c: 7 (gDB)

    Die Ausgabe zeigt die Sequenz von Funktionsaufrufen. Funktionsaufruf # 0 - die jüngste - ist auf die wird C-Library-Funktion. Das wird Anruf stammt in der READ_INPUT Funktion (in Zeile 16 der Datei dbgtst.c), Die wiederum von der angerufene wird Main Funktion in Zeile 7 der dbgtst.c Datei.

  4. Verwenden Sie die Liste Befehl, um die Linien von verdächtigen Quellcode zu überprüfen.

    Im dbgtst, Sie können mit der Linie 16 von starten dbgtst.c Datei, wie folgt:

    (GDB) Liste dbgtst.c: 1611 Rückkehr 0-12} 13 ungültig READ_INPUT (char * s) 14 {15 printf ( "Befehl:") -16 bekommt (s) -17} 18 (GDB)

    Nachdem bei dieser Auflistung suchen, können Sie sagen, dass das Problem der Weg sein kann, READ_INPUT wird genannt. Dann listen Sie die Linien um die Linie 7 in dbgtst.c (bei dem die READ_INPUT rufen Sie stammt):

    (GDB) Liste dbgtst.c: 72 static char buf [256] -3 Leere READ_INPUT (char * s) -4 int main (void) 5 {6 char * input = NULL- / * Nur ein Zeiger, kein Speicher für String * / 7 READ_INPUT (Eingang) -8 / * Prozess-Befehl. * / 9 printf ( "Sie haben eingegeben:% s n", input) -10 / *. . . * / 11 return 0- (GDB)

    An dieser Stelle können Sie das Problem auf die Variable verengen benannt Eingang. Diese Variable ist ein Array, kein NULL (Was bedeutet, Null) Zeiger.

Menü