Frage

Im Anschluss an diese Frage:
Gute Absturzberichtsbibliothek in C#

Gibt es eine Bibliothek wie CrashRpt.dll, die unter Linux dasselbe tut?Das heißt, einen Fehlerbericht einschließlich eines Core-Dumps und aller erforderlichen Umgebungen erstellen und den Entwickler darüber benachrichtigen?

Bearbeiten:Dies scheint ein Duplikat von zu sein diese Frage

War es hilfreich?

Andere Tipps

Kompilieren Sie Ihren Code mit Debug-Symbolen, geben Sie unlimit coredumpsize in Ihre Shell ein und Sie erhalten einen Coredump im selben Ordner wie die Binärdatei.Verwenden Sie gdb/ddd – öffnen Sie zuerst das Programm und dann den Core-Dump.Du kannst nachschauen Das Weitere Informationen finden Sie hier.

@Ionut
Dies übernimmt die Generierung des Core-Dumps, aber nicht die Benachrichtigung des Entwicklers, wenn bei anderen Benutzern Abstürze aufgetreten sind.

Nathan, unter welchen Umständen in einem Segment mit einer Basis ungleich Null?Das ist mir in den fünf Jahren, in denen ich Linux-Anwendungen entwickle, noch nie passiert.

Danke.

@Martin

Ich mache eine Architekturvalidierung für x86, also bin ich sehr Ich bin mit der Architektur des Prozessors vertraut, aber sehr unmit der Verwendung vertraut.Darauf habe ich meinen Kommentar gestützt.Wenn man sich darauf verlassen kann, dass CR2 die richtige Antwort gibt, dann bin ich korrigiert.

Nathan, ich habe nicht darauf bestanden, dass du falsch lagst;Ich habe gerade gesagt, dass in meiner (begrenzten) Erfahrung mit Linux die Segmentbasis immer Null ist.Vielleicht ist das eine gute Frage für mich ...

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

Der erste, EIP, gibt die Codeadresse an, an der die Ausnahme aufgetreten ist.In der Antwort von RichQ verwendet er addr2line, um die Quellzeile anzuzeigen, die der Absturzadresse entspricht.Aber EIP kann ungültig sein;Wenn Sie einen Funktionszeiger aufrufen, der null ist, kann dies der Fall sein 0x00000000, und wenn Sie Ihren Aufrufstapel beschädigen, kann die Rückgabe einen beliebigen zufälligen Wert in EIP einfügen.

Der Zweite, CR2, gibt die Datenadresse an, die den Segmentierungsfehler verursacht hat.Im Beispiel von RichQ richtet er i als Nullzeiger ein und greift dann darauf zu.In diesem Fall wäre CR2 0x00000000.Aber wenn Sie sich ändern:

int j = *i

Zu:

int j = i[2];

Dann versuchen Sie, auf die Adresse zuzugreifen 0x00000008, und das wäre in CR2 zu finden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top