系统(“暂停”)导致堆损坏

时间:2013-09-16 15:10:56

标签: c++ main

所以这很奇怪,可能有一个非常简单的解释,但是我使用的是一台我通常不会使用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(“cls”))也不会导致问题。我倾向于这是我正在研究的机器特有的,但我不确定。提前谢谢!

感谢任何帮助。

[编辑]

所以我以前从未调试过标准标题(至少没有故意),但我注意到了一件事:

__crtCorExitProcess中,加载mscoree.dll模块的调用返回一个空句柄,这意味着它没有被加载。我不确定这是不是通常会发生的事情,但是这样做会跳过一段获取exit proc函数指针的代码。调用此方法之后调用ExitProcess调用,并且从此处触发中断。

[编辑2]

  

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

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

  

线程'Win32 Thread'(0x1ca8)已退出,代码为0(0x0)。   HEAP [ProjectB.exe]:HEAP:自由堆块21a4ba8在被释放后在21a4c10修改

这对我很好奇。

1 个答案:

答案 0 :(得分:1)

我认为这里的问题是运行的安全软件阻止某些DLL被加载和/或注入代码以防止恶意指令被执行。由于我从来没有在个人计算机上遇到过这种情况,而且只是在一个有很多安全管理的公司包装盒上遇到这种情况,我认为就是这样。我怀疑这是一个运行时不匹配,因为没有其他产生意外的结果。谢谢所有评论潜在问题的人!如果您遇到此问题,请阅读评论,因为此处还有其他潜在问题。