Stack-Traces automatisch auf Unix-Systemen abrufen

7

Welche Methoden gibt es, um automatisch einen Stack-Trace auf Unix-Systemen zu bekommen? Ich meine damit nicht nur eine Kerndatei oder eine Verknüpfung mit GDB, sondern einen SIGSEGV-Handler, der ein Backtrace in eine Textdatei schreibt.

Bonuspunkte für die folgenden optionalen Funktionen:

  • Zusätzliche Informationen zum Zeitpunkt des Absturzes (zB Konfigurationsdateien).
  • Schicken Sie den Entwicklern ein Crash-Info-Paket per E-Mail.
  • Möglichkeit, dies in einer dlopen ed freigegebenen Bibliothek hinzuzufügen
  • Keine GUI erforderlich
Ted Percival 20.08.2008, 15:50
quelle

4 Antworten

7

Wenn Sie sich auf Systemen mit der backtrace Funktionalität von BSD befinden (Linux, OSX 1.5, BSD von Natürlich können Sie das programmatisch in Ihrem Signal-Handler tun.

Zum Beispiel ( backtrace Code abgeleitet von IBM Beispiel ):

%Vor%

Ausgabe:

%Vor%

Dies erhält keine Bonuspunkte für die optionalen Funktionen (außer dass keine GUI erforderlich ist), es hat jedoch den Vorteil, dass es sehr einfach ist und keine zusätzlichen Bibliotheken oder Programme benötigt.

    
Derek Park 20.08.2008, 17:36
quelle
15

Zu Ihrer Information,

Die vorgeschlagene Lösung (mit backtrace_symbols in einem Signalhandler) ist gefährlich kaputt. BENUTZEN SIE ES NICHT -

Ja, backtrace und backtrace_symbols erzeugen jedoch eine Backtrace und übersetzen diese in symbolische Namen:

  1. backtrace_symbols reserviert Speicher mithilfe von malloc und Sie verwenden free, um es freizugeben - Wenn Sie aufgrund von Speicherbeschädigung abstürzen, ist Ihre Malloc-Arena höchstwahrscheinlich beschädigt und verursacht einen doppelten Fehler.

  2. malloc und free schützen die Malloc-Arena intern mit einem Lock. Du könntest in der Mitte eines malloc / free mit der getroffenen Sperre einen Fehler gemacht haben, was diese Funktion oder irgendetwas, das sie aufruft, zum totalen Sperren bringt.

  3. Sie verwenden puts, die den Standard-Stream verwenden, der ebenfalls durch eine Sperre geschützt ist. Wenn Sie mitten in einem Printf einen Fehler gemacht haben, haben Sie wieder einen Deadlock.

  4. Auf 32bit-Plattformen (zB Ihr normaler PC von vor 2 Jahren) wird der Kernel eine Rückkehradresse an eine interne Glibc-Funktion anlegen, anstatt Ihre Fehlerfunktion in Ihrem Stack, also die wichtigste Information, die Sie haben sind daran interessiert - in welcher Funktion der Programmfehler aufgetreten ist, wird auf diesen Plattformen tatsächlich verfälscht.

Also, der Code in dem Beispiel ist die schlimmste Art von falsch - es sieht aus wie es funktioniert, aber es wird Sie wirklich in unerwarteten Wegen in der Produktion scheitern.

BTW, daran interessiert, es richtig zu machen? Überprüfen Sie diese .

Prost, Gilad.

    
Gilad Ben-Yossef 20.11.2008 13:36
quelle
4

Hier ist ein Beispiel, wie man mit einem Entwerter mehr Informationen bekommt. Wie Sie sehen, protokolliert dieser auch den StackTrace in Datei.

%Vor%     
AndersO 03.09.2008 15:22
quelle
2

Dereks Lösung ist wahrscheinlich die beste, aber hier ist eine Alternative sowieso:

Die aktuelle Linux-Kernel-Version ermöglicht es Ihnen, Core-Dumps an ein Skript oder Programm zu übergeben. Sie könnten ein Skript schreiben, um den Core-Dump abzufangen, zusätzliche Informationen zu sammeln und alles zurückzuschicken. Dies ist jedoch eine globale Einstellung, so dass es für jedes Absturzprogramm auf dem System gelten würde. Es erfordert auch Root-Rechte einzurichten. Es kann über die Datei / proc / sys / kernel / core_pattern konfiguriert werden. Setze das auf etwas wie '| / home / myuser / bin / mein-core-handler-script '.

Die Ubuntu-Leute benutzen diese Funktion ebenfalls.

    
Kristof Provost 23.08.2008 06:31
quelle

Tags und Links