如何调试'ESP的值没有保存在函数调用'错误?

时间:2009-10-19 13:10:22

标签: c++ debugging stack

在我的程序退出的极少数情况下,我得到“ESP的值没有在函数调用中保存”错误。该错误非常随机且难以重现。

如何调试此错误(VC ++ 2008)?它是多么苛刻,因为它只在停机时发生?在发布模式下错误是否也可见?

3 个答案:

答案 0 :(得分:5)

这意味着您要么调用具有错误调用约定的函数 - 这通常在您不正确地声明函数指针时发生 - 或者存在覆盖堆栈的事情。

调试前者检查导致这种情况的功能。要调试后者,请查找堆栈分配的缓冲区溢出等内容。

答案 1 :(得分:1)

我遇到了同样的问题,并设法解决了这个问题。在我看来,虽然事情非常具体。没有贴出一些示例代码就很难分辨。这就是导致问题的原因。下面我将展示一个破坏我程序的例子。

class MyClass; //Forward declaration
typedef (MyClass::*CallBack)(Object*);

当注册新的CallBack时,程序在离开当前函数调用时崩溃。

class ThisClass : public MyClass
{
  //...
}
//...

//...
void ThisClass::Init(void)
{
  Sys.RegisterCallBack((CallBack)&ThisClass::Foo);
} //The program crashed at this line

为了解决这个问题,我摆脱了前向声明并简单地包含了头文件。

#include "MyClass.h"
typedef (MyClass::*CallBack)(Object*);

总结一下,当你想使用该类的成员函数指针时,不要转发声明!

答案 2 :(得分:0)

这意味着程序的某些部分通过堆栈写入。那很糟。你很幸运,现在它在关机时发生,但迟早有人可能会在另一个地方使用失败的功能。

当消息消失时,您可以看到您所在的功能。您可以做的是重新运行程序,并在进入该功能时,在写入esp的位置放置一个数据断点。然后运行到函数的末尾 - 违规代码将触发数据断点。