Wenn ich ein Programm von der Shell aus starte und es segfaults:
$ buggy_program
Segmentation fault
Es wird mir jedoch mitgeteilt, dass es eine Möglichkeit gibt, Programme zum Drucken eines Backtraces zu veranlassen, indem sie möglicherweise Folgendes ausführen:
$ print_backtrace_if_segfault buggy_program
Segfault in main.c:35
(rest of the backtrace)
Ich würde auch lieber nicht strace oder ltrace für diese Art von Informationen verwenden, da sie so oder so gedruckt werden ...
Tut mir leid, dass ich 2 Jahre später hierher komme ... bin auf der Suche nach etwas anderem gestoßen. Der Vollständigkeit halber hinzufügen.
1) Obwohl ich die akzeptierte Antwort für großartig halte, erfordert sie gdb. Die mir vertraute Methode verwendet libSegFault.so.
Wenn Sie Ihre App mit ausführen
Sie erhalten einen Bericht mit Backtrace, geladenen Bibliotheken usw
2) Es
catchsegv
ist auch ein Wrapper-Skript verfügbar, mit dem versucht wird,addr2line
Adressen in Dateiname + Zeilennummer zu übersetzen.Dies sind viel leichtere Lösungen als Core-Dateien oder GDB (gut für eingebettete Systeme zum Beispiel)
quelle
LD_PRELOAD=libSegFault.so
ist es in Ordnung, wenn es im dl-Pfad liegt.Sie brauchen jedermanns Freund GDB
Sobald Sie Ihr Corefile geladen haben, erhalten Sie mit dem Befehl 'backtrace' (abgekürzt als bt) den aktuellen Aufrufstapel. Wenn Sie Ihr Programm in gdb ausführen, können Sie beliebige Haltepunkte setzen und den Speicherinhalt usw. untersuchen.
quelle
catchsegv
Es wurde in einer anderen Antwort erwähnt (aber in keiner Weise darauf konzentriert). Es ist ein praktisches Tool, das mit dem glibc-Projekt gebündelt ist. Es wird nur dann eine Rückverfolgung (und andere nützliche Debug-Informationen) bereitstellen, wenn ein Programm tatsächlich einen Fehler aufweist.
Eine gute aufzuschreiben existiert hier .
Sie können es nach Belieben in Ihre eigenen Skripte einbinden.
quelle
Ubuntu (als Projekt) verwendet dazu Apport. Sie können sehen, wie sie es gemacht haben.
https://wiki.ubuntu.com/Apport
quelle
/proc/sys/kernel/core_pattern
Hier ist eine leicht modifizierte Variante des Skripts von Kyle Brandt. Es wird auf folgende Weise verbessert:
Skript:
quelle
-ex
stattdessen einfach verwenden .gdb ... -ex 'set pagination off' -ex backtrace -ex quit