PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C/C++: Maximum an Infos zu SegFault???



7.e.Q
27-07-2006, 12:48
Hi Leute,

wie kann ich innerhalb eines Programms, das an einer schwer zu detektierenden Stelle abstürzt, mithilfe eines Signal Handlers für Segmentation Fault das Maximum an möglichen Informationen über den Ursprungspunkt des SegFaults herausfinden?

Debugger ist nicht praktikabel, da das Programm eigenartigerweise nur abstürzt, wenn es als Daemon läuft, der während des Bootvorgangs gestartet wurde. :eek:

Danke

Hendrik

locus vivendi
27-07-2006, 14:16
Du kannst im Signalhandler testen warum der Segfault erzeugt wurde:
http://www.opengroup.org/onlinepubs/009695399/basedefs/signal.h.html

Und du kannst einen Coredump anlegen, z.B. hiermit:
http://goog-coredumper.sourceforge.net/

Auf machen Systemen kann man wohl auch einstellen das bei eintreffen eines bestimmten Signals automatisch ein Coredump angelegt wird, aber damit habe ich keine Erfahrung.

Das hier könnte vielleicht auch hilfreich sein:
http://www.gentoo.org/proj/en/qa/backtraces.xml

7.e.Q
28-07-2006, 10:30
Ich nutze bereits den erweiterten Signalhandler sigaction(). Diesem kann man auch Informationen übergeben, bzw. er bekommt eine Struktur von Informationen mitgeliefert. Dort stehen auch einige Infos zu dem SegFault drin. Ich muss diese eigentlich nur umsetzen. Gibt's da praktische Tips zu? Jemand das schonmal gemacht?

locus vivendi
29-07-2006, 14:36
Hier sind eigentlich ganz anschauliche Beispiele drin:
http://www.linuxjournal.com/node/6391/print

RapidMax
30-07-2006, 22:57
Das einfachste in diesem Fall ist sicherlich ein core-dump anzulegen. Dazu wird der Prozess mit bash -c "ulimit -c unlimited; /mein/prozess" gestartet. Den code-Dump kannst du dir dann später in aller Ruhe mittels gdb -c core /mein/process anschauen, vermutlich brauchst du dabei nur das Kommando bt.

Gruss, Andy

7.e.Q
01-08-2006, 08:10
Das einfachste in diesem Fall ist sicherlich ein core-dump anzulegen. Dazu wird der Prozess mit bash -c "ulimit -c unlimited; /mein/prozess" gestartet. Den code-Dump kannst du dir dann später in aller Ruhe mittels gdb -c core /mein/process anschauen, vermutlich brauchst du dabei nur das Kommando bt.

Gruss, Andy

Das setzt voraus, daß ich vor dem Gerät, auf dem das Programm läuft, sitze. Ich hätte die Informationen, die mir gdb liefert (Code-Datei:Zeilennummer) aber gern in dem Parent-Prozess verfügbar, um diese per proprietärem Nachrichtendienst an unsere Bedien-Software schicken zu können. Zur Zeit schicke ich dort nur hin, DASS die Software abgestürzt ist, nicht jedoch, wo. Das wäre noch sehr interessant.

Achso: ich muss dazu sagen, daß nicht nur das Programm selbst manchmal abstürzt, sondern auch Child-Prozesse. Die würde ich auch gern auf die Weise überwachen können. Priorität in diesem Thread soll aber die Überwachung des Eltern-Prozesses sein; also daß er mir detailierte Informationen darüber gibt, wo genau er abstürzt, wenn er dies tut.

7.e.Q
01-08-2006, 10:44
Das mit den backtrace-Funktionen ist ja echt mal geil. Das ist ja im Prinzip genau das, was ich benötige. Wenn's dann im Fehlerfall auch korrekt funktioniert.