2

我对堆栈跟踪的理解本质上是基于基指针和堆栈指针到底是什么?他们指向什么?.

我多年来一直帮助开发的一个程序在崩溃时会吐出一个堆栈转储,我已经习惯于评估这些堆栈跟踪,与 C++ 编译器生成的 .map 文件相对应。很多次,我已经成功地遍历堆栈和调试问题。

但是,有时堆栈跟踪有一个 NULL EBP(帧)指针。以下是来自此类示例堆栈转储的相关片段:

Initial EBP pointer value: 04d8fab0
{at address 04d8fab0: 00000000}

如您所见,EBP 帧指针的值为 NULL。因此,我不能走堆栈。

这是堆栈损坏的迹象,还是有其他可能的解释?

4

1 回答 1

1

如您所见,EBP 帧指针的值为 NULL。因此,我不能走堆栈。这是堆栈损坏的迹象,还是有其他可能的解释?

我认为还有另一种解释,其根源在于除了保存当前堆栈帧的地址之外,EBP 寄存器还可以用于任何其他用途,例如通用寄存器。为了安全地做到这一点,需要做两件事:

  1. 通过调用将其当前内容存储到堆栈中

    推送 EBP

  2. 恢复通用使用后退出当前程序前的内容,调用

    POP EBP

所以我认为您遇到的情况不一定是由堆栈损坏引起的,因为从技术上讲,它可能是在 EBP 寄存器暂时被进程中的其他地方用于通用用途时生成了转储'代码,甚至可能不是您编写的代码。

于 2013-09-08T19:31:34.310 回答