GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Können Sie jedes Programm in Linux dazu bringen, einen Stack-Trace zu drucken, wenn es einen Segfault hat?

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ühren

LD_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


Linux
  1. Wie sind Sie zu Linux gekommen?

  2. 3 nützliche Dinge, die Sie mit dem IP-Tool in Linux tun können

  3. Linux-Startvorgang:Ein Leitfaden für den Einstieg

  4. Können Sie Xcode unter Linux ausführen?

  5. Wie erhalte ich einen Stack-Trace für C++ mit gcc mit Zeilennummerinformationen?

So verfolgen Sie die Programmausführung mit dem Linux-Strace-Befehl

13 Möglichkeiten, wie Sie Linux helfen können

Die besten Linux-Magazine, die Sie abonnieren können

Benötigen Sie Java? So können Sie es Java unter Linux installieren

Kannst du das toppen? 15 praktische Beispiele für Top-Befehle unter Linux

Reise eines C-Programms zu Linux Executable in 4 Stufen