我对堆栈轨迹的理解基本上是基于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。所以我不能走栈。
这是一个损坏堆栈的标志,还是有另一种可能的解释?
您是否正在构建优化?有时编译器会使用'%ebp'作为通用寄存器来给它一个额外的注册表来处理......这是以使跟踪堆栈几乎不可能的代价为代价的。大多数编译器也可以选择禁用这种行为。 – FatalError
您使用哪种编译器和编译标志? – Neil
在Visual Studio中,“Omit Frame Pointers”选项设置为“No”(在发行版以及调试模式下)。的确,在许多堆栈轨迹中,帧指针是有效的。是否有可能是帧指针有时是有效的,而忽略帧指针不符合我的期望? –