为啥 ntdll.dll 会使我的 c++ 可执行文件崩溃?

Posted

技术标签:

【中文标题】为啥 ntdll.dll 会使我的 c++ 可执行文件崩溃?【英文标题】:Why is ntdll.dll crashing my c++ executable?为什么 ntdll.dll 会使我的 c++ 可执行文件崩溃? 【发布时间】:2012-11-03 12:16:33 【问题描述】:

我无法让 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 中编译的可执行文件可以工作,但我在使用 2008 或 2010 等较新的 VS 编译的可执行文件时遇到错误。请指教

【问题讨论】:

几乎可以肯定不是 ntdll.dll 使您的可执行文件崩溃。很可能您的程序有一些以前被屏蔽的未定义行为,而编译器或库中的一些其他微不足道的变化恰好使问题变得可见。不过,您确实需要追溯您的应用当时在做什么才能发现问题。 问题是它的 3,000 行代码我无法判断程序中的哪里存在缺陷。如果有人能指出我正确的方向。 首先,使用调试信息构建代码并在调试器下运行。这将(通常,无论如何)让您停止它并查看它崩溃时发生了什么,并可能获得堆栈跟踪以找出导致崩溃的代码的哪一部分。 异常代码 0xC0000374 表示 STATUS_HEAP_CORRUPTION。这是使 C++ 程序崩溃的最常见方法。 您可以通过在调试器下以调试模式运行它来修复它... 【参考方案1】:

解决此类问题可能是一项真正的挑战...尤其是当您不熟悉代码库时。

考虑将Application Verifier 与 Visual Studio 调试器结合使用。

    启动 Visual Studio 并编译您的应用程序 启动应用程序验证器实用程序。 File => Add Application 选择适当的Tests(例如堆、异常...) 使用 Visual Studio Debug 启动您的应用程序。

当发生不好的事情时...您的调试器将停止。这应该可以让您很好地了解问题的根源。

此外,它可能有助于在开始测试之前加载缺失的符号。在 Visual Studio 2012 中,您可以通过以下方式执行此操作: Debug => Options and Settings => Debugging => Symbols => Load all symbols.

祝你好运!

参考文献

MSDN: "Application Verifier" article Download: Application Verifier 之前此应用程序可单独下载:here 此下载不再可用。 该应用程序现在包含在 Windows SDK 中。 (以前称为 Platfrom SDK) 请注意,您可能安装了两个版本: C:\Windows\SysWOW64\appverif.exe [32 位版本] C:\Windows\System32\appverif.exe【64位版本】 TechNet: Two Minute Drill: Application Verifier

更新:2015 年 7 月

完成后,请务必禁用您启用的 AppVerfier 检查...否则您可能会在 6 个月后忘记 时遇到一些意想不到的副作用AppVerifier.

【讨论】:

刚刚在运行 mstsc.exe 时使用这种方法来解决 ntdll.dll 中的堆损坏问题。原来是第三方蓝牙堆栈导致了这种情况,Application Verifier 帮助我抓住了它。 我是应用程序验证程序的新手。在第一行它告诉我“VERIFIER STOP 00000900: pid 0x136C: A heap allocation was leaked.” “0BA92FE8 : address of the leaked allocation. Run !heap -p -a 获取有关分配的其他信息。”上面这条线。它说“运行”我在哪里运行这个命令?我从来没有弄乱过这些命令,如果这是一个菜鸟问题,我很抱歉。我认为它是在命令行或什么的?我从未在其他任何地方见过这种命令风格。 我昨天刚刚经历了噩梦。如果不这样做(禁用您启用的应用程序...),您将浪费大量时间进行调查..即使您重新安装它也会一次又一次地崩溃。 应用程序验证器下载链接已失效 对于win10:developer.microsoft.com/en-us/windows/downloads/windows-10-sdk;存档:developer.microsoft.com/windows/downloads/sdk-archive

以上是关于为啥 ntdll.dll 会使我的 c++ 可执行文件崩溃?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 __inbyte 会使我的软件崩溃?

为啥我的 unwind segue 会使我的应用程序崩溃?

为啥这个 WHERE 子句会使我的查询慢 180 倍?

为啥用 numpy 计算 2×2 矩阵的特征向量会使我的 Python 会话崩溃?

为啥这个旧的依赖会使我的 gradle 崩溃?

为啥添加导航控制器会使我的数组消失?