- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我目前正在处理一个相当大的(和旧的,唉)代码库,最近升级到 VS2005 (SP1)。我和我的团队正在更改/更新/替换此代码中的模块,但我们偶尔会遇到 vtables 似乎已损坏的问题。我不是 vtables 专家,但这些肯定似乎被打破了。错误表现为以下错误:
Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.
当然,这个错误可能有很多其他原因,但在调试(调试构建)时,我实际上可以验证我想要操作的对象的 vtables 看起来很奇怪:
引用每个 vtable 的堆栈和堆看起来很好,指向 vtable 的指针与映射文件完美匹配。这向我表明这不是内存覆盖错误或类似错误,因为那时它会影响堆栈和堆而不是 vtables 的存储位置。 (它们存储在只读区域,对吗?)无论如何,到目前为止一切似乎都很好。但是当查看 vtable 的内存时,我发现所有值,如果我将它们解释为指针,尽管它们在同一范围内(例如 0x00f203db 0x00f0f9be 0x00ecdda7 0x00f171e1)与映射文件中的任何条目都不匹配,其中许多甚至没有对齐到 4 个字节。我不知道 VS2005 如何构建 vtables 的所有细节,但这对我来说是错误的。如果这是正确的行为,也许有人可以向我解释一下?
我想我的问题归结为什么会导致这种行为?例如,当类层次结构过于复杂时,链接器中是否存在任何已知错误?有人以前见过类似的东西吗?目前,我们能够通过将函数从受影响的类移动到内联(可怕的东西!)来避免崩溃,但显然这不是一个可行的长期解决方案。
感谢您的任何见解!
更新:有人要求我提供有关该项目的更多详细信息,我当然会提供。但是,首先,问题并不完全与 ESP 值未保存错误有关。我最感兴趣的是为什么我会在 vtable 中看到奇怪的值。也就是说,这里有一些额外的信息:该解决方案依赖于几个外部和内部项目,但这些项目已经很长时间没有改变,都使用相同的调用约定。它似乎中断的代码都在解决方案的一个非常标准的 C++“主”项目中。所有代码都是用同一个编译器构建的。该解决方案也不使用任何 dll,而是与大量静态库链接:
SHFolder.lib、python25.lib、dxguid.lib、d3d9.lib、d3dx9.lib、dinput8.lib、ddraw.lib、dxerr9.lib、ws2_32.lib、mss32.lib、Winmm.lib、vtuneapi.lib , vttriggers.lib, DbgHelp.lib, kernel32.lib, user32.lib, gdi32.lib, winspool.lib, comdlg32.lib, advapi32.lib, shell32.lib, ole32.lib, oleaut32.lib, uuid.lib, odbc32 .lib, odbccp32.lib
最佳答案
我发现了问题。确实很愚蠢,但是导致问题的类层次结构有一个名为 GetObject 的虚函数,它与具有相同名称的 Windows #define 冲突。头文件以不同的顺序包含这些 Windows 头文件,这使链接器感到困惑。所以,实际上问题是vtables损坏了,但我没想到这是原因!嗯,你每天都学到一些东西......
不过,非常感谢所有的回复!
关于c++ - VS2005 C++ 损坏的虚表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/580985/
我有一个特别的问题想要解决,我不确定是否可行,因为我找不到任何信息或正在完成的示例。基本上,我有: class ParentObject {}; class DerivedObject : publi
在我们的项目中,我们配置了虚 URL,以便用户可以在地址栏中输入虚 URL,这会将他们重定向到原始 URL。 例如: 如果用户输入'http://www.abc.com/partner ',它会将它们
我是一名优秀的程序员,十分优秀!