崩溃报告中的CPU寄存器地址在分析中如何有用

How are CPU register addresses in crash reports useful in analysis?

本文关键字:何有用 有用 报告 CPU 寄存器 崩溃 地址      更新时间:2023-10-16

苹果产生这些崩溃日志,我的线程0已经崩溃了,但这个问题不是关于那个。这是一般性的问题,我想知道我们如何在崩溃分析中利用这些处理器寄存器值?他们如何帮助你调查车祸?我想到的唯一一件事是,如果任何寄存器有像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(帧指针)和RSP(堆栈指针)分别指向内存中堆栈的底部和顶部。了解了所有这些,您就可以准确地查看崩溃时的堆栈是什么,以及是哪条指令导致了崩溃。

除了@nrabbit所说的,如果您知道代码的调用约定,您还可以使用寄存器来了解函数的一些参数的值是什么以及函数调用的结果是什么。这里有一些英特尔呼叫约定的例子。因此,eax寄存器通常保存32位程序中的函数结果,例如