崩溃报告中的CPU寄存器地址在分析中如何有用
How are CPU register addresses in crash reports useful in analysis?
苹果产生这些崩溃日志,我的线程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位程序中的函数结果,例如
相关文章:
- 为什么需要复制构造函数,在哪些情况下它们非常有用
- 其中降频广播实际上是有用的
- 既然我们有内联变量,extern const 还有用吗?
- 函子还有更有用的用例吗?
- `__declspec(novtable)`没有用吗
- P1008("prohibit aggregates with user-declared constructors")在实践中什么时候有用?
- 当迭代器(输入参数)通常不是constexpr时,constexpr算法真的有用吗
- 将指向数据成员的指针传递给 std::invoke 时有哪些用例和有用性?
- std::bit_cast 和 std::start_lifetime_as 之间有什么有用的区别吗?
- 在现代C++中,临时寿命延长何时有用?
- 在不编写显式 setter 的情况下修改私有类数据成员的便捷方法是什么?模板有用吗?
- 是否有任何情况下,具有已删除CTOR的课程可能有用
- KeyEqual 在 std::unordered_set/std::unordered_map 中的有用性
- std::make_pair 和 std::make_tuple 在 C++17 中的有用性
- 如果我在 Xbox UWP 应用程序上收到激活错误并且错误消息中没有任何有用的内容,该怎么办
- std::unique_ptr<std::array<T,N是否有用例>>
- 自C 11以来,挥发性在并发编程中的有用性
- 是在实践中有用的释放序列的概念
- 移动const对象是否有有用的方案
- 在C++中声明一个类"final : public virtual"有用吗?