6

所以这很奇怪,可能有一个非常简单的解释,但我使用的是一台我通常不使用工厂默认安装的 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 被释放后修改

这对我来说很好奇。

4

1 回答 1

1

我认为这里的问题是正在运行的安全软件会阻止某些 DLL 被加载和/或注入代码以防止执行恶意指令。由于我从未在个人机器上经历过这种情况,而且我只是在进行大量安全管理的公司机器上经历过这种情况,我认为就是这样。我怀疑这是运行时不匹配,因为没有其他任何东西会产生意想不到的结果。感谢所有评论潜在问题的人!如果您遇到此问题,请阅读评论,因为那里讨论了其他潜在问题。

于 2013-09-16T15:56:26.860 回答