【问题标题】:System( "pause" ) Causes Heap CorruptionSystem("pause") 导致堆损坏
【发布时间】: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

这对我来说很好奇。

【问题讨论】:

  • 请注意,&lt;iostream&gt; 不会为您提供任何关于包含的 C 标头的任何保证,因此实际上需要 &lt;cstdlib&gt;。但这不应该是错误的根源。
  • 这听起来像是运行时库对我来说不匹配。
  • 查看编辑 2:看起来您出于某种原因在 log4cxx 中进行了链接,并且它从某个地方获取了一个奇怪的配置文件,并且可能 pause 命令弄乱了 stdio设置。
  • 我刚刚用VS2010编译了程序,调试版和发布版都运行良好。如果您的机器上有杀毒软件,请关闭它并重试。我曾经遇到一个奇怪的崩溃问题,这是由于杀毒软件向进程注入了一个DLL,它使用了不同版本的运行时库。
  • 我认为您可以使用 systeminteral 中的两个工具:进程监视器和进程浏览器。第一个可以记录DLL的加载顺序,试着找到你的程序不应该加载的DLL,检查这些DLL的依赖关系。

标签: c++ main


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-15
    • 2021-11-10
    • 1970-01-01
    相关资源
    最近更新 更多