系统( "pause" ) 导致堆损坏

System( "pause" ) Causes Heap Corruption

本文关键字:损坏 pause 系统      更新时间:2023-10-16

所以这很奇怪,可能有一个非常简单的解释,但我使用的是一台我通常不开发的机器,出厂默认安装的VS 2010。下面发布的代码正是我正在运行的代码,它导致了这条熟悉的消息:

Windows 在 ProjectB.exe 中触发了一个断点。

这可能是由于堆损坏,这表示 ProjectB 或其加载的任何 DLL 中存在错误.exe

这也可能是由于用户在 ProjectB.exe 具有焦点时按 F12。

输出窗口可能包含更多诊断信息。

代码为:

#include <iostream>
#include <cstdlib>
using namespace std;
int main( int argc, char** argv )
{
    system( "pause" );
    return 0;
}

就是这样!仅此而已,只有一个文件。注释掉系统("暂停")不会触发中断,但我无法阻止程序退出(如您所料)。所以我真的很困惑。这对我来说似乎真的很奇怪,因为我以前从未经历过这种情况,我不明白为什么这会导致问题。使用另一个不会停止进程的系统命令(如 system( "cls" ))也不会导致问题。我的倾向是,这是特定于我正在工作的机器,但我不确定。提前感谢!

任何帮助,不胜感激。

[编辑]

所以我以前从未调试过标准标头(至少不是故意的),但我注意到一件事:

在加载 mscoree.dll 模块的调用__crtCorExitProcess返回空句柄,这意味着它不会加载。我不确定这是否是正常情况,但在这样做时它会跳过获取退出进程函数指针的代码块。正是在调用此方法之后,调用了对ExitProcess的调用,并且从此处触发了中断。

[编辑2]

调用system( "pause" )后在输出窗口中生成以下内容: 在 ProjectB.exe 中0x750cc41f处的首次机会异常:Microsoft C++异常:内存位置 0x006ff1fc>log4cxx::helpers::IOException。 在 Project B.exe 中0x750cc41f处的第一次机会异常:Microsoft C++异常:内存位置 0x006ff344 处的>log4cxx::helpers::IOException。 SPLogger: setFile(C:\ProgramData\Safend\Logs.18698\SPHook.log,true) call failed. SPLogger:IO 异常:状态代码 = 720005 SPLogger:没有为名为 [SPHookLog] 的追加器设置输出流或文件。

然后,当调用 ExitProcess 时,这会添加到输出窗口中:

线程

"Win32 线程"(0x1ca8) 已退出,代码为 0 (0x0)。 堆[项目B.exe]:堆:释放后在21a4c10修改的可用堆块21a4ba8

这让我很好奇。

我相信

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