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.
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. –