2012-05-02 102 views
2

我对堆栈轨迹的理解基本上是基于What is exactly the base pointer and stack pointer? To what do they point?如果EBP帧指针为NULL,堆栈是否损坏?

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

但是,有时堆栈跟踪有一个NULL EBP(帧)指针。下面是从这样的样品堆栈转储相关片段:

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

正如可以看到,在EBP帧指针的值是NULL。所以我不能走栈。

这是一个损坏堆栈的标志,还是有另一种可能的解释?

+0

您是否正在构建优化?有时编译器会使用'%ebp'作为通用寄存器来给它一个额外的注册表来处理......这是以使跟踪堆栈几乎不可能的代价为代价的。大多数编译器也可以选择禁用这种行为。 – FatalError

+0

您使用哪种编译器和编译标志? – Neil

+1

在Visual Studio中,“Omit Frame Pointers”选项设置为“No”(在发行版以及调试模式下)。的确,在许多堆栈轨迹中,帧指针是有效的。是否有可能是帧指针有时是有效的,而忽略帧指针不符合我的期望? –

回答

1

正如您所看到的,EBP帧指针的值为NULL。因此, 我不能走栈。这是堆栈损坏的标志,还是有其他可能的解释吗?

我认为另一种解释,扎根,除了保持当前堆栈帧的地址,EBP寄存器也可用于类似通用寄存器任何其他目的的事实。为了做到这一点安全,需要两两件事:

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

    PUSH EBP

  2. 恢复中普通后的内容通用电话

    POP EBP

所以我在想您所遇到不一定由堆栈损坏引起的情况下,因为它在技术上可能是已生成转储而暂时被用于一般EBP寄存器在过程的代码中的其他地方使用它,甚至可能不是你编写的代码。

+0

有趣的可能性。你知道这样的行为是否真的会发生,或者这纯粹是一种理论上的可能性,据你所知? –