在amd64中调试main函数之前堆栈溢出

时间:2013-08-08 00:57:44

标签: c++ memory dll

我有一个有多个依赖项的32位应用程序。对依赖性的粗略估计如下 -

[handshake_win32.exe] ----> [libhandshake32.dll] ----> [libeay32,ssleay32.dll] ----> [zlib1.dll]

现在我想通过JNI使用我的libhandshake32.dll来重用代码。由于JVM是64位的,所以我想这些库需要重新编译为x64 arch。

我的第一个目标是在x64中运行当前基线handshake_win32.exe。所以我已经重新编译了x64的所有dll。但是在我成功重新编译后,当我开始进入调试模式时,我在主函数处立即获得Stack Overflow。

  

handshake_win32.exe中0x000007f602f79567处的未处理异常:   0xC00000FD:堆栈溢出。

我试图用dumpbin检查dll签名,似乎所有机器类型都是x64。 dependency walker为所有x64模块提供以下错误消息 -

  

错误:由于缺少,至少有一个模块具有未解析的导入   隐式依赖模块中的导出函数。错误:带有的模块   找到了不同的CPU类型。

它显示加载了x86版本的MSVCR100.dll,其中实际dll的arch是x64。

有谁能说明这个问题的可能原因是什么?

提前致谢。

1 个答案:

答案 0 :(得分:0)

1,如果使用cmd / bat编译你的dll, 以这种方式启动cmd / bat:

%comspec% /k ""PATH_TO_VS\VC\vcvarsall.bat"" amd64

%comspec% /k ""PATH_TO_VS\VC\vcvarsall.bat"" x86_amd64

而不是:

%comspec% /k ""PATH_TO_VS\VC\vcvarsall.bat"" x86

2,如果你使用gui,你最好检查一下命令行:

c/c++->command line
linker->command line

有时,当您在vs gui中更改配置时,命令行不会更改, 你最好开始一个新项目并在那里复制你的源文件。