【发布时间】:2013-09-16 15:10:55
【问题描述】:
所以这很奇怪,可能有一个非常简单的解释,但我使用的是一台我通常不会在出厂默认安装的 VS 2010 上开发的机器。下面发布的代码正是我正在跑步,它导致了这个熟悉的消息:
Windows 已在 ProjectB.exe 中触发断点。
这可能是由于堆损坏,这表明 ProjectB.exe 或其已加载的任何 DLL 中存在错误。
这也可能是由于用户在 ProjectB.exe 获得焦点时按 F12。
输出窗口可能有更多的诊断信息。
代码是:
#include <iostream>
#include <cstdlib>
using namespace std;
int main( int argc, char** argv )
{
system( "pause" );
return 0;
}
就是这样!仅此而已,只有一个文件。注释掉 system("pause") 不会触发中断,但我无法阻止程序退出(如您所料)。所以我真的很困惑。这对我来说似乎真的很奇怪,因为我以前从未经历过这种情况,而且我不明白为什么这会导致问题。使用另一个不会停止进程的系统命令(如 system("cls"))也不会导致问题。我的倾向是这是特定于我正在使用的机器,但我不确定。提前致谢!
感谢任何帮助。
[编辑]
所以我以前从未调试过标准头文件(至少不是故意的),但我注意到一件事:
在__crtCorExitProcess 中,加载 mscoree.dll 模块的调用返回一个空句柄,这意味着它没有被加载。我不确定这是否是通常发生的情况,但这样做会跳过一段获取 exit proc 函数指针的代码。正是在调用此方法之后,才调用了对ExitProcess 的调用,并从这里触发了中断。
[编辑 2]
调用
system( "pause" )后在输出窗口中产生以下内容: ProjectB.exe 中 0x750cc41f 处的第一次机会异常:Microsoft C++ 异常:>log4cxx::helpers::IOException 在内存位置 0x006ff1fc.. ProjectB.exe 中 0x750cc41f 处的第一次机会异常:Microsoft C++ 异常:>log4cxx::helpers::IOException 在内存位置 0x006ff344.. SPLogger:setFile(C:\ProgramData\Safend\Logs.18698\SPHook.log,true) 调用失败。 SPLogger:IO 异常:状态码 = 720005 SPLogger: 没有为名为 [SPHookLog] 的附加程序设置输出流或文件。
然后在调用 ExitProcess 时,将其添加到输出窗口:
线程“Win32 线程”(0x1ca8) 已退出,代码为 0 (0x0)。 HEAP[ProjectB.exe]: HEAP: Free Heap block 21a4ba8 在被释放后修改为 21a4c10
这对我来说很好奇。
【问题讨论】:
-
请注意,
<iostream>不会为您提供任何关于包含的 C 标头的任何保证,因此实际上需要<cstdlib>。但这不应该是错误的根源。 -
这听起来像是运行时库对我来说不匹配。
-
查看编辑 2:看起来您出于某种原因在
log4cxx中进行了链接,并且它从某个地方获取了一个奇怪的配置文件,并且可能pause命令弄乱了 stdio设置。 -
我刚刚用VS2010编译了程序,调试版和发布版都运行良好。如果您的机器上有杀毒软件,请关闭它并重试。我曾经遇到一个奇怪的崩溃问题,这是由于杀毒软件向进程注入了一个DLL,它使用了不同版本的运行时库。
-
我认为您可以使用 systeminteral 中的两个工具:进程监视器和进程浏览器。第一个可以记录DLL的加载顺序,试着找到你的程序不应该加载的DLL,检查这些DLL的依赖关系。