Apple 生成了这些崩溃日志,我的线程 0 崩溃了,但这个问题与此无关。这是一般性问题,我想知道我们如何在崩溃分析中使用这些处理器寄存器值?他们如何帮助您调查事故?我唯一想到的是,如果任何寄存器有 NULL 指针,例如下面的 rcx
,这让您了解代码中可能的空指针取消引用,这是正确的假设吗?
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
最佳答案
您可以使用寄存器 RIP(指令指针)来确定它在哪条机器指令上失败。我不确定 GDB 是否可以在 Mac OSx 上运行,但在 Linux 中您可以使用 GDB(GNU 调试器)然后分析汇编指令以找到产生错误的确切指令。另外,寄存器RBP(Frame Pointer)和RSP(Stack Pointer)分别指向内存中的栈底和栈顶。了解所有这些后,您就可以准确查看崩溃时堆栈的内容以及导致崩溃的指令。
关于c++ - 崩溃报告中的 CPU 寄存器地址对分析有何帮助?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39782223/