在我的程序退出的极少数情况下,我得到“ESP的值没有在函数调用中保存”错误。该错误非常随机且难以重现。
如何调试此错误(VC ++ 2008)?它是多么苛刻,因为它只在停机时发生?在发布模式下错误是否也可见?
答案 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
的位置放置一个数据断点。然后运行到函数的末尾 - 违规代码将触发数据断点。