Erzeugung von core dump erzwingen trotz eigenem SIGSEGV handler
Ein Problem mit Programmen ist, dass diese immer mal wieder abstürzen. Der Kunde mault, der Entwickler ist ratlos wie es dazu gekommen ist. Um post-mortem noch etwas über den Crash der Applikation feststellen zu können, gibt es unter *nix coredump-files.
Nun kann man mit ulimit -c unlimited
die Erstellung dieser coredump zwar einschalten, aber das nützt nix, wenn man einen eigenen Signal handler für SIGSEGV hat, in dem man z.B. einen Stacktrace generieren und in ein Logfile zur Schnellanalyse schreiben kann.
Zufällig bin ich auf einen Mailinglisteneintrag gestoßen, wo erklärt wird, wie man den Signalhandler so setzt, dass trotzdem noch ein Stacktrace generiert wird. Prinzipiell muss man mit sigaction
mithilfe des Flags SA_RESETHAND
einstellen, dass der Signal-handler selbst auch wieder ein signal absetzen darf und im Signal-handler dann mit raise
das Signal nochmals senden, sodass der Kernel den Coredump produziert.
Ich habe den Code noch etwas erweitert, um z.B. die Erstellung eines Coredumps trotz ulimit -c 0 zu ermöglichen
und in meinem Signal handler gibt’s einen Stracktrace auf stderr.
Den Beispielcode findet man hier
Das weitere Debuggen des coredumps sollte dann ohnehin bekannt sein:
gdb [executable] [coredump]
thread apply all bt
Comments
Hi,
da dump.at jetzt schon länger down ist, komme ich nicht an den Beispielcode.
Wäre es möglich, den noch irgendwo anders hochzuladen?
Danke!
Moin. Leider ist das Link zum Beispielcode down – der hätte mich jetzt unheimlich interessiert.
Gibts eine Möglichkeit den anderweitig zu kriegen?
ist wieder online.
code.dump.at wieder online. Sorry für downtime.
Trackbacks