为什么ntdll.dll会导致我的C++可执行文件崩溃?

19

我在尝试运行一个Visual C++可执行文件时遇到了问题,应用程序崩溃了,以下是我在事件查看器中看到的内容。

Faulting application name: submit.exe, version: 0.0.0.0, time stamp: 0x50a3cce7
Faulting module name: ntdll.dll, version: 6.1.7601.17514, time stamp: 0x4ce7ba58
Exception code: 0xc0000374
Fault offset: 0x000ce653
Faulting process id: 0x8fc
Faulting application start time: 0x01cdc2a3da4f2997
Faulting application path: c:\submit.exe
Faulting module path: C:\Windows\SysWOW64\ntdll.dll
Report Id: 1813823a-2e97-11e2-8675-000c29229191

使用旧版 Visual Studio 编译的可执行文件可以正常运行,但是使用更新的 VS(如2008或2010)编译的可执行文件会出错,请给予建议。


2
几乎可以肯定地说,ntdll.dll不会导致您的可执行文件崩溃。最有可能的是,您的程序存在一些未定义的行为,之前被掩盖了,而编译器或库中的某些微不足道的更改恰好使问题变得可见。但是,您真的需要追溯到应用程序在出现问题时所做的操作才能找到问题的根源。 - Jerry Coffin
问题在于它有3,000行代码,我无法确定程序中哪里存在缺陷。如果有人能指引我正确的方向就太好了。 - user1789769
首先,使用调试信息构建您的代码,并在调试器下运行它。这通常可以让您在程序崩溃时停止它并查看正在发生的情况,并可能获得堆栈跟踪以确定导致崩溃的代码部分。 - Jerry Coffin
异常代码0xC0000374表示STATUS_HEAP_CORRUPTION。这是导致C++程序崩溃的最常见方式。 - Hans Passant
你可以通过在调试器下以调试模式运行它来修复它... - C.J.
1个回答

17
解决这种问题可能会带来真正的挑战……特别是当你不熟悉代码库时。考虑使用Application Verifier与Visual Studio调试器一起使用。
1. 启动Visual Studio并编译应用程序 2. 启动应用程序验证工具。 3. 文件 => 添加应用程序 4. 选择适当的测试(例如堆、异常等) 5. 使用Visual Studio调试启动应用程序。
当出现问题时,调试器会停止。这应该能够给你一个相当好的问题来源的想法。

另外,在开始测试之前,加载缺失的符号可能会有所帮助。在Visual Studio 2012中,您可以通过以下方式实现:

调试 => 选项和设置 => 调试 => 符号 => 加载所有符号

祝你好运!

参考资料

更新:2015年7月

完成后,请确保禁用您启用的AppVerifier检查...否则,当您忘记AppVerifier时,可能会在6个月后遇到一些意外的副作用。


1
我刚刚使用这种方法来解决运行mstsc.exe时ntdll.dll中的堆损坏问题。结果发现是第三方蓝牙堆栈引起的,而应用程序验证器帮助我捕捉到了它。 - David Airapetyan
3
我对 Application Verifier 不熟悉。第一行告诉我“VERIFIER STOP 00000900: pid 0x136C:发生了堆内存泄漏。”“0BA92FE8:泄漏分配的地址。运行 !heap -p -a <address> 命令获取有关该分配的其他信息。”以上这行话说“运行”,那么我在哪里运行这个命令呢?我从来没有碰过这些命令,如果这是一个新手问题,那我很抱歉。我猜这应该在命令行或者类似的地方运行吧?因为我在其他地方从来没见过这种命令格式。 - Franky Rivera
我昨天刚刚经历了噩梦。如果不这样做(禁用您启用的应用程序...),您将浪费大量时间进行调查。即使重新安装,它也会一遍又一遍地崩溃。 - CharlesX
下载应用程序验证器的链接已失效。 - Ayxan Haqverdili
适用于win10的下载链接: https://developer.microsoft.com/en-us/windows/downloads/windows-10-sdk/;存档链接:https://developer.microsoft.com/windows/downloads/sdk-archive - Louis Go

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接