2016-09-30 3 views
2

Apple generiert diese Absturzprotokolle und mein Thread 0 ist abgestürzt, aber das ist nicht die Frage. Dies ist eine generische Frage und ich frage mich, wie können wir diese Prozessorregisterwerte in der Crash-Analyse nutzen? Wie helfen sie dir, deinen Unfall zu untersuchen? Nur was mir in den Sinn kommt, ist, wenn eines der Register einen NULL-Zeiger wie rcx im folgenden hat, was Ihnen eine Vorstellung über die mögliche Nullzeiger-Dereferenzierung im Code gibt, ist das die korrekte Annahme?Wie sind CPU-Registeradressen in Absturzberichten für die Analyse nützlich?

Thread 0 crashed with X86 Thread State (64-bit): 
    rax: 0x00000001046e17a0 rbx: 0x00000001043665f0 rcx: 0x0000000000000000 rdx: 0x00000001046e14f0 
    rdi: 0x00000001046e14e0 rsi: 0x00000001046314e8 rbp: 0x00007fff5b89f890 rsp: 0x00007fff5b89f7e0 
    r8: 0x00007fff686a7690 r9: 0x0000000000000250 r10: 0x00007fffa2478201 r11: 0x000000000009ea18 
    r12: 0x00000001046b11d8 r13: 0x00007fff686a75c8 r14: 0x00007fff686ae638 r15: 0x0000000000000000 
    rip: 0x00000001043601be rfl: 0x0000000000010206 cr2: 0x0000000000000060 

Logical CPU:  0 
Error Code:  0x00000004 
Trap Number:  14 
+0

Sie helfen in vielerlei Hinsicht; Die bloße Tatsache, dass Sie sehen können, was an einer Speicheradresse liegt oder was der Wert eines Registers ist, hilft enorm ... –

+0

@ l'L'l das ist wahr, aber was sind einige Möglichkeiten, wie Sie es benutzen? – PnotNP

Antwort

3

Mit dem Register RIP (Instruction Pointer) können Sie feststellen, bei welchem ​​Maschinenbefehl ein Fehler aufgetreten ist. Ich bin mir nicht sicher, ob GDB unter Mac OSx funktioniert, aber in Linux können Sie GDB (GNU Debugger) verwenden, um die Assembleranweisungen zu analysieren, um die genaue Anweisung zu finden, die den Fehler verursacht hat. Zusätzlich zeigen die Register RBP (Frame Pointer) und RSP (Stack Pointer) jeweils auf den unteren und oberen Teil des Stapels im Speicher. Wenn Sie all diese Dinge kennen, können Sie genau sehen, was der Stapel zum Zeitpunkt des Absturzes war und welcher Befehl den Absturz verursacht hat.

+0

OS X verwendete früher gdb, heutzutage ist lldb Standard. –

+0

'-fomit-frame-pointer' hat die Standardeinstellung (auch für 32-bit-Code) seit ein paar Jahren, also ist RBP nur ein anderes Register (wie RBX oder R12-R15), nicht der Frame-Pointer. Diese Art des Stack-Abwickelns erfordert Metadaten (aus dem Abschnitt ".eh_frame") und den Inhalt des Stack-Speichers, so dass Sie es erhalten können, wenn Sie einen Core-Dump haben. –

0

Zusätzlich zu dem, was @nrabbit gesagt hat, können Sie auch die Register verwenden, um zu verstehen, was die Werte einiger der Argumente für die Funktion waren und was das Ergebnis des Funktionsaufrufs war, wenn Sie die Aufrufkonventionen des Codes kennen . Here are some examples of Intel calling conventions. So enthält das eax Register normalerweise ein Funktionsergebnis in 32-Bit-Programmen.

+0

Nur wenn Sie wissen, dass der Absturz bei einer Funktion CALL oder RET aufgetreten ist. Innerhalb einer Funktion sind die Register alle temporärer Scratch Space, bis die letzte Modifikation von 'eax' den Rückgabewert erzeugt. Funktionen modifizieren auch ihre arg-Register. Sie müssen sich also nur die Asm am Unfallort ansehen, um herauszufinden, was das für die beteiligten C-Variablen bedeutet. ** Es gibt nichts nützliches, das du sagen kannst, ohne den Code um den Wert von RIP sorgfältig zu betrachten. ** –

Verwandte Themen