【问题标题】:"The value of ESP was not properly saved across a function call." problem [duplicate]“ESP 的值未在函数调用中正确保存。”问题[重复]
【发布时间】:2011-09-17 21:22:14
【问题描述】:

可能重复:
Weird MSC 8.0 error: “The value of ESP was not properly saved across a function call…”

我有一个没有任何源代码的 OBJ 文件。我在另一个项目中使用它没有任何问题。现在我正在尝试在另一个项目中使用它。这是我声明它的方式:

extern "C" bool FileCompare(char* file1, char* file2);

我在这样的函数中使用它:

void myFunction() {
    //some code
    FileCompare(file1, file2); // file1 and 2 are char arrays
}

然后在我的主代码中调用 myFunction:

int main() {
    ... some code
    myFunction()
}

当 myFunction 返回时,我得到“ESP 的值未在函数调用中正确保存。”在 Visual Studio 2010 调试器中。但是,我知道 FileCompares(obj 文件中的函数)可以完成它的工作。当我将其注释掉时,一切正常。我过去使用过这个 OBJ 文件没有任何问题。考虑到我没有 obj 文件的来源,有什么办法可以尝试“修补”这个问题吗?

非常感谢

更多细节:我怀疑代码使用了没有 RET 的 CALL(它是用汇编编写的)。

编辑:我不知道我所说的事情是否有意义,但由于函数损坏了 esp,无论如何都要保存它并在函数返回后恢复它?

【问题讨论】:

  • obj文件也是用VS2010编译的吗?有或没有 SP1?
  • OBJ文件是用masm编写编译的
  • 更多细节:我怀疑代码使用 CALL 而没有 RET(它是用汇编编写的)。
  • “代码使用 CALL 而不使用 RET”到底是什么意思?

标签: c++ x86 stack


【解决方案1】:

这可能是由于FileCompare() 中的错误或myFunction() 和/或FileCompare() 的声明和实现之间的调用约定不匹配造成的。

您也许可以在FileCompare() 的原型上使用适当的说明符(例如__cdecl)来解决问题。或者您可能需要为修复问题的FileCompare() 函数创建一个汇编语言包装器(因为您说您不再拥有FileCompare() 的源代码)。

在没有 FileCompare() 源的情况下准确找出问题所在可能需要在调试器中逐步完成程序集。

【讨论】:

  • +1 是一个很好的答案,但他说他“在另一个项目中使用它没有任何问题”......所以我想知道项目之间有什么不同?
  • @Nemo: 搞砸ESP 并不总是会导致明显的问题——如果EBP 被用作帧寄存器,那么locals 仍然可以访问,ESP 通常会在调用者完成后恢复,因为它通常只需将EBP 移动到其中即可恢复。换句话说,它是否会被注意到在很大程度上取决于工具和具体情况。
【解决方案2】:

当我针对旧头文件编译一个项目时遇到了类似的问题,该头文件与最新的头文件不同,缺少一个虚函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-30
    • 2013-07-03
    • 2012-04-06
    • 2018-11-28
    • 2015-09-06
    • 1970-01-01
    • 2023-03-06
    相关资源
    最近更新 更多