2010-06-09 9 views
30

Ich würde gerne wissen, ob mein Programm Zugriff auf NULL-Zeiger oder veraltete Speicher.Wie kann ich GDB dazu bringen, mir mitzuteilen, welche Adresse einen Fehler verursacht hat?

Der Backtrace sieht wie folgt 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 ??() 

Antwort

47

Mit GDB 7 und höher, können Sie die $_siginfo Struktur untersuchen, die ausgefüllt wird, wenn das Signal auftritt, und bestimmen Sie die Verwerfungen Adresse:

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

Wenn es (void *) 0x0 (oder eine kleine Zahl) zeigt Ihnen dann habe eine Nullzeiger-Dereferenzierung.

+0

(GDB) p $ _siginfo $ 1 = Leere Ich denke, siginfo nicht auf dieser Architektur unterstützt :( – nornagon

+0

Stellen Sie sicher, GDB v7 oder höher verwenden ... – To1ne

+0

Verwenden 'ptype $ _siginfo' um zu sehen, was sonst in der Struktur ist. – To1ne

0

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

Sie können den Befehl "print" (p) in GDB verwenden, um Variablen zu überprüfen. Wenn der Absturz in einem Bibliotheksaufruf aufgetreten ist, können Sie die Befehlsfolge "frame" verwenden, um den fraglichen Stapelrahmen zu sehen.

+0

Der segfault ist nicht im Code, dass ich die Quelle habe. – nornagon

+0

@Nornagon: Der Befehl 'bt' zeigt Ihnen ein Backtrace, mit dem Sie sehen können, wo Sie in Ihrem eigenen Code waren, als der Fehler auftrat. – caf

+0

Ja, ich weiß, aber es ist immer noch keine Hilfe - es war in einer Bibliothek Funktionsaufruf mit mehreren Argumenten, und ich weiß nicht, welches dieser Argumente verursacht einen segfault. – nornagon

Verwandte Themen