Lösung 1:
Es könnte einen besseren Weg geben, aber diese Art von Automatisierung ist es.
Fügen Sie Folgendes in ~/backtrace
ein :
backtrace
quit
Fügen Sie dies in ein Skript namens seg_wrapper.sh
ein in einem Verzeichnis in Ihrem Pfad:
#!/bin/bash
ulimit -c unlimited
"[email protected]"
if [[ $? -eq 139 ]]; then
gdb -q $1 core -x ~/backtrace
fi
Die ulimit
Befehl macht es so, dass der Kern ausgegeben wird. "[email protected]"
sind die Argumente, die dem Skript gegeben werden, also wären es Ihr Programm und seine Argumente. $?
hält den Exit-Status, 139 scheint der Standard-Exit-Status für meinen Rechner für einen Segfault zu sein.
Für gdb
, -q
bedeutet leise (keine Intro-Nachricht) und -x
sagt gdb
um Befehle in der ihm übergebenen Datei auszuführen.
Nutzung
Um es also zu verwenden, würden Sie einfach:
seg_wrapper.sh ./mycommand and its arguments
Aktualisieren
Sie könnten auch einen Signal-Handler schreiben, der dies tut, siehe diesen Link.
Lösung 2:
Tut mir leid, dass ich 2 Jahre später hier reinkomme ... bin darüber gestolpert, als ich nach etwas anderem gesucht habe. Der Vollständigkeit halber hinzugefügt.
1) Obwohl ich die akzeptierte Antwort großartig finde, erfordert sie gdb. Die Methode, mit der ich vertraut bin, verwendet libSegFault.so.
Wenn Sie Ihre App mit
ausführenLD_PRELOAD=...pfad-zu.../libSegFault.so myapp
Sie würden einen Bericht mit Backtrace, geladenen Bibliotheken usw. erhalten
2) Ein Wrapper-Skript catchsegv
ist ebenfalls verfügbar, die versuchen würde, addr2line
zu verwenden um Adressen in Dateiname + Zeilennummer zu übersetzen.
Dies sind viel einfachere Lösungen als Kerndateien oder gdb (gut zum Beispiel für eingebettete Systeme)
Lösung 3:
Sie brauchen alle Freunde GDB
gdb <program> [core file]
Sobald Sie Ihr Corefile geladen haben, gibt Ihnen der Befehl „backtrace“ (kann mit bt abgekürzt werden) den aktuellen Aufrufstapel. Wenn Sie Ihr Programm innerhalb von gdb ausführen, können Sie beliebige Haltepunkte setzen und den Speicherinhalt untersuchen usw.
Lösung 4:
catchsegv
Es wurde in einer anderen Antwort erwähnt (aber in keiner Weise darauf fokussiert). Es ist ein praktisches Tool, das mit dem glibc-Projekt gebündelt ist. Es liefert nur wenn einen Backtrace (und andere nützliche Debug-Informationen). ein Programm macht tatsächlich einen Segfault.
Eine gute Beschreibung gibt es hier.
Sie können es nach Belieben in Ihre eigenen Skripte einfügen.
Lösung 5:
Ubuntu (als Projekt) verwendet dazu Apport. Sie können sehen, wie sie es gemacht haben.
https://wiki.ubuntu.com/Apport