2010-08-05 7 views
6

Ich schreibe ein Plugin für eine Anwendung, gelegentlich würde ein SIGSEGV werfen. Die Anwendung fängt jedoch das Signal SIGSEGV ab. Mit anderen Worten, das Plugin ist eine dynamische Bibliothek. Der Fehler tritt in meinem Plugin und in der dynamischen Bibliothek auf. Aber die Anwendung behandelt den sSIGSEGV und normal beendet. Also ist es ziemlich schwierig für mich zu debuggen und das Backtrace aller Stack Frames zu bekommen. Irgendeine Idee?Wie Debug-Programm mit Signal-Handler für SIGSEGV

Derzeit verwende ich gdb als Debug-Tool.

Antwort

6

GDB wird fangen SIGSEGV, bevor die Anwendung der Fall ist.

Was Sie im Kommentar zu Logans Antwort beschrieben haben, ergibt keinen Sinn.

Ich vermute, was wirklich passiert ist, dass die Anwendung einen neuen Prozess erstellt, und nur SIGSEGV in diesem anderen Prozess, nicht die, an die Sie GDB angeschlossen.

Die folgenden Befehle können nützlich sein, wenn meine Vermutung richtig ist:

(gdb) catch fork 
(gdb) catch vfork 
(gdb) set follow-fork-mode child 

Sie auch möchten Ihre Frage bearbeiten und erweitern:

  • wie Sie wissen, es ist ein SIGSEGV beginnen mit?
  • Auch die Veröffentlichung eines Protokolls Ihrer Interaktion mit GDB kann sich als nützlich erweisen.
+0

Sie haben Recht. Sicherlich sollte ich den Fehler des Kindprozesses verstehen. Danke. – Blad

+0

Ich habe versucht, nach Ihrem Vorschlag, aber ein anderes Problem machen die App abgebrochen: "Shell-init: Fehler beim Abrufen des aktuellen Verzeichnisses: getcwd: kann nicht auf übergeordnete Verzeichnisse zugreifen: Keine solche Datei oder Verzeichnis". Irgendeine Idee? – Blad

4

Auch wenn das Programm SIGSEGV abfängt, sollte gdb es immer noch zuerst bekommen und Ihnen die Möglichkeit geben, das Programm zu debuggen. Haben Sie etwas wie

handle SIGSEGV nostop 

in GDB getan? Wenn ja, könnte das der Grund sein, warum es nicht aufhört.

Sind Sie sicher, dass tatsächlich ein segfault auftritt? Können Sie dieses Verhalten mit einem anderen Programm duplizieren oder absichtlich eine Segmentierungsverletzung verursachen?

Zum Beispiel:

$ cat sig.c 
#include <signal.h> 
#include <stdio.h> 
#include <stdlib.h> 

void handle(int n) 
{ 
     puts("Bail"); 
     exit(1); 
} 

int main() 
{ 
     signal(SIGSEGV, handle); 
     int *pi = 0; 
     *pi = 10; 
     return 0; 
} 
$ gcc -g sig.c 
$ ./a.out 
Bail 
$ gdb ./a.out 
GNU gdb 6.6-debian 
Copyright (C) 2006 Free Software Foundation, Inc. 
GDB is free software, covered by the GNU General Public License, and you are 
welcome to change it and/or distribute copies of it under certain conditions. 
Type "show copying" to see the conditions. 
There is absolutely no warranty for GDB. Type "show warranty" for details. 
This GDB was configured as "i486-linux-gnu"... 
Using host libthread_db library "/lib/tls/i686/cmov/libthread_db.so.1". 
(gdb) run 
Starting program: /home/elcapaldo/a.out 

Program received signal SIGSEGV, Segmentation fault. 
0x08048421 in main() at sig.c:15 
15    *pi = 10; 
(gdb) where 
#0 0x08048421 in main() at sig.c:15 
(gdb) c 
Continuing. 
Bail 

Program exited with code 01. 
(gdb) q 
+0

Vielen Dank für Ihre Antwort. Nein, eigentlich habe ich "handle all stop" benutzt, und es hat nicht funktioniert. Selbst wenn ich "handle all nopass" versuchte, fing die App immer noch SIGSEGV und normal aus. – Blad

+0

Richtig, ich debuggte wieder. Es schien, dass der Absturz in einem Folgesteuer passiert ist. – Blad