2013-05-22 5 views
7

Wenn meine Anwendung mit einem Segmentierungsfehler abstürzt, möchte ich einen Core Dump vom System bekommen. Ich tue, dass vor der Hand durch die KonfigurationLinux: Behandlung eines Segmentierungsfehlers und Erhalt eines Core Dumps

ulimit -c unlimited 

Ich würde auch einen Hinweis in meinen Anwendungsprotokoll haben mag, dass ein Zugriffsfehler aufgetreten ist. Ich mache das mit sigaction(). Wenn ich das jedoch tue, erreicht das Signal seine Standardbehandlung nicht und ein Core-Dump wird nicht gespeichert.

Wie kann ich sowohl den Systemkern als auch eine Protokollzeile von meinem eigenen Signalhandler gleichzeitig ausgeben lassen?

Antwort

1

Die Antwort: Setzen Sie die sigaction mit Flag SA_RESETHAND und kehren Sie einfach vom Handler zurück. Derselbe Befehl tritt erneut auf, was erneut einen Segmentierungsfehler verursacht und den Standard-Handler aufruft.

+0

Können Sie das näher erläutern? – Short

+0

Ich fürchte, ich kann nicht. – shoosh

+1

Dies funktioniert nicht mit der Version von Redhat 6, auf der ich getestet habe, und verursacht eine regressive Schleife, bei der der Handler nicht zurückgesetzt wird. Es funktioniert, wenn Sie den alten Handler beim Aufruf von sigaction speichern und ihn explizit im SIGSEGV-Handler zurücksetzen. – phenompbg

5
  1. Überschreiben Sie den Standard-Signalhandler für SIGSEGV, um Ihre benutzerdefinierte Protokollierungsfunktion aufzurufen.
  2. Nachdem es protokolliert wurde, wiederherstellen und den Standard-Handler auslösen, der den Core-Dump erstellt.

Hier ist ein Beispielprogramm signal mit:

void sighandler(int signum) 
{ 
    myLoggingFunction(); 

    // this is the trick: it will trigger the core dump 
    signal(signum, SIG_DFL); 
    kill(getpid(), signum); 
} 

int main() 
{ 
    signal(SIGSEGV, sighandler); 

    // ... 
} 

Die gleiche Idee auch mit sigaction funktionieren soll.

Quelle: How to handle SIGSEGV, but also generate a core dump

+0

Was für mich funktionierte, war das Signal zu setzen (signum, SIG_DFL); und lassen Sie den Signal-Handler zurückkehren. – Vincent

Verwandte Themen