2008-09-08 9 views

Antwort

3
+0

Ich will nicht auf Ihre Parade regen, wollte ich diesen Link als eine zusätzliche Ressource. Ich bin immer noch daran interessiert, wie ich den Backtrace zurück zu den Entwicklern bringen kann (zB kerneloops.org).Bisher scheint es so, als würde die Sammlung der Umgebung und der damit verbundenen Daten dem einzelnen Entwickler überlassen. –

2

Kompilieren Sie Ihren Code mit Debug-Symbolen zu sein, unlimit coredumpsize in der Shell eingeben und Sie erhalten eine coredump im selben Ordner wie die binären erhalten. Verwenden Sie gdb/ddd - öffnen Sie zuerst das Programm und dann den Core Dump. Sie können this für weitere Informationen überprüfen.

1

@Ionut
Dies behandelt die Erstellung des Core-Dumps, aber es behandelt nicht den Entwickler benachrichtigt, wenn andere Benutzer abgestürzt sind.

0

Hinweis: Es gibt zwei interessante Register in einem x86 Seg-Fault-Absturz.

Die erste, EIP, gibt die Codeadresse an, bei der die Ausnahme aufgetreten ist. In RichQs Antwort verwendet er addr2line, um die Quellzeile anzuzeigen, die der Crash-Adresse entspricht. Aber EIP kann ungültig sein; Wenn Sie einen Funktionszeiger aufrufen, der null ist, kann es 0x00000000 sein, und wenn Sie Ihren Aufrufstapel beschädigen, kann die Rückkehr beliebigen beliebigen Wert in EIP abrufen.

Die zweite, CR2, gibt die Datenadresse an, die den Segmentierungsfehler verursacht hat. Im RichQ-Beispiel richtet er i als Null-Zeiger ein und greift dann darauf zu. In diesem Fall wäre CR2 0x00000000. Aber wenn Sie ändern:

int j = *i 

zu:

int j = i[2]; 

Dann Sie versuchen, Adresse zuzugreifen 0x00000008, und das ist, was in CR2 gefunden werden würde.

+0

Beachten Sie, dass CR2 eigentlich die lineare Adresse des fehlerhaften Zugriffs ist, während 0x00000008 der virtuelle Offset ist. Wenn die Segmentbasis nicht Null ist, sind die beiden unterschiedlich, und CR2 wird * segment_base + 0x00000008 * melden. –

0

Nathan, unter welchen Umständen in einer Segmentbasis nicht Null? Ich habe nie gesehen, dass dies in meinen 5 Jahren Linux-Anwendungsentwicklung auftritt.

Danke.

0

@ Martin

ich architektonische Validierung für x86, also bin ich sehr vertraut mit der Architektur der Prozessor liefert, aber sehr un vertraut, wie es verwendet wird. Darauf basiert mein Kommentar. Wenn CR2 für die richtige Antwort gezählt werden kann, dann bleibe ich korrigiert.

1

Nathan, ich bestand nicht darauf, dass Sie falsch waren; Ich habe nur gesagt, dass in meiner (begrenzten) Erfahrung mit Linux die Segmentbasis immer Null ist. Vielleicht ist das eine gute Frage für mich zu fragen ...