所以这很奇怪,可能有一个非常简单的解释,但我使用的是一台我通常不使用工厂默认安装的 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 中 0x750cc41f 的第一次机会异常.exe: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:释放堆块 21a4ba8 在 21a4c10 被释放后修改
这对我来说很好奇。