Wie kann ich GDB dazu bringen, mir mitzuteilen, welche Adresse einen Segfault verursacht hat?

Lesezeit: 2 Minuten

Benutzeravatar von nornagon
Nornagon

Ich würde gerne wissen, ob mein Programm auf NULL-Zeiger oder veralteten Speicher zugreift.

Der Backtrace sieht so aus:

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x2b0fa4c8 (LWP 1333)]
0x299a6ad4 in pthread_mutex_lock () from /lib/libpthread.so.0
(gdb) bt
#0  0x299a6ad4 in pthread_mutex_lock () from /lib/libpthread.so.0
#1  0x0058e900 in ?? ()

Mit GDB 7 und höher können Sie das überprüfen $_siginfo Struktur, die ausgefüllt wird, wenn das Signal auftritt, und ermitteln Sie die fehlerhafte Adresse:

(gdb) p $_siginfo._sifields._sigfault.si_addr

Wenn es sich zeigt (void *) 0x0 (oder eine kleine Zahl), dann haben Sie eine NULL-Zeiger-Dereferenzierung.

  • (gdb) p $_siginfo $1 = void Ich denke, siginfo wird auf dieser Architektur nicht unterstützt 🙁

    – Nornagon

    9. Juni 2010 um 6:10 Uhr

  • Verwenden ptype $_siginfo um zu sehen, was sonst noch in der Struktur ist.

    – To1ne

    15. Juli 2011 um 6:01 Uhr

Führen Sie Ihr Programm unter GDB aus. Wenn der Segfault auftritt, informiert Sie GDB über die Zeile und Anweisung Ihres Programms zusammen mit der Variablen und der zugehörigen Adresse.

Sie können den Befehl “print” (p) in GDB verwenden, um Variablen zu untersuchen. Wenn der Absturz in einem Bibliotheksaufruf aufgetreten ist, können Sie die Befehlsfolge “Frame” verwenden, um den betreffenden Stack-Frame anzuzeigen.

  • @nornagon: Die bt Der Befehl zeigt Ihnen einen Backtrace, mit dem Sie sehen können, wo Sie sich in Ihrem eigenen Code befanden, als der Fehler aufgetreten ist.

    – Café

    9. Juni 2010 um 6:10 Uhr

  • Ja, ich weiß, aber es ist immer noch keine Hilfe – es war in einem Bibliotheksfunktionsaufruf mit mehreren Argumenten, und ich weiß nicht, welches dieser Argumente einen Segfault verursacht.

    – Nornagon

    9. Juni 2010 um 6:15 Uhr

  • achte auf diejenigen, die falsch sein könnten; Setzen Sie bp vor die Stelle, an der Sie vermuten, dass ein Sigfault auftreten könnte, und gehen Sie instr für instr vor, um wichtige Variablen zu beobachten …

    – Shin Takezou

    9. Juni 2010 um 7:54 Uhr

  • @nornagon: Ihr Backtrace ist verdächtig – Sie haben wahrscheinlich eine Stack-Korruption, bevor Sie Ihre Argumente aufrufen. Wenn das schrittweise Durchlaufen des Codes (“n” und “s”) das Problem nicht aufdeckt, ist es an der Zeit, Valgrind auszubrechen.

    – Jan Ramin

    9. Juni 2010 um 16:12 Uhr

1411110cookie-checkWie kann ich GDB dazu bringen, mir mitzuteilen, welche Adresse einen Segfault verursacht hat?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy