与 ntdll.dll 相关的无法解释的崩溃

Posted

技术标签:

【中文标题】与 ntdll.dll 相关的无法解释的崩溃【英文标题】:Unexplained crashes related to ntdll.dll 【发布时间】:2019-05-12 15:04:19 【问题描述】:

我编写的应用程序间歇性崩溃,但我无法在应用程序层捕获异常。我总是在事件日志中得到一个条目,但没有给我太多信息:

Faulting application name: BCS-UI.exe, version: 1.0.11.0, time stamp: 0x5c0edcbd
Faulting module name: ntdll.dll, version: 10.0.17134.376, time stamp: 0x4358e406
Exception code: 0xc0000374
Fault offset: 0x000d8829
Faulting process id: 0x39b0
Faulting application start time: 0x01d49161c80079a0
Faulting application path: C:\Gogs Local\SMR_Windows_UI\BCS-UI\BCS-UI\bin\Release\BCS-UI.exe
Faulting module path: C:\WINDOWS\SYSTEM32\ntdll.dll
Report Id: 1fbc4761-d256-44b0-99b0-4d9d758e4fe0
Faulting package full name: 
Faulting package-relative application ID: 

    - System 

  - Provider 

   [ Name]  Application Error 

  - EventID 1000 

   [ Qualifiers]  0 

   Level 2 

   Task 100 

   Keywords 0x80000000000000 

  - TimeCreated 

   [ SystemTime]  2018-12-11T15:12:28.109191000Z 

   EventRecordID 23318 

   Channel Application 

   Computer Leviathan 

   Security 


- EventData 

   BCS-UI.exe 
   1.0.11.0 
   5c0edcbd 
   ntdll.dll 
   10.0.17134.376 
   4358e406 
   c0000374 
   000d8829 
   39b0 
   01d49161c80079a0 
   C:\Gogs Local\SMR_Windows_UI\BCS-UI\BCS-UI\bin\Release\BCS-UI.exe 
   C:\WINDOWS\SYSTEM32\ntdll.dll 
   1fbc4761-d256-44b0-99b0-4d9d758e4fe0 

如你所见,我明白了:

错误模块路径:C:\WINDOWS\SYSTEM32\ntdll.dll。

我不确定那是什么或它与崩溃有何关系,但我已经能够在多台机器上重现它,我不知道如何确定原因或防止它发生。

更新:由于上述原因,我已经到了应用程序在启动时崩溃的地步。它到达 MainWindow 构造函数的末尾(它是一个 WPF 应用程序),在白屏上停留大约 10 秒钟,然后死掉。我已经回滚到旧版本的软件并重现了这种行为。我也将它移到另一台机器上,但没有看到这种行为,所以我目前的理论与 cmets 中所说的一致 - 某些东西破坏了堆,只有在重新启动时才会被清除。

更新 2:在调试器外部运行时,我能够生成此错误消息,但在调试器中运行时,我无法让它在异常时停止:

GDI+ 中发生一般错误

这就是我今天要寻找的东西。有趣且令人不安的是,应用程序每次启动时都会崩溃,即使在重新启动后也是如此。此时其他机器上不会出现相同的行为。

【问题讨论】:

关键信息是Exception code: 0xc0000374,这是一个堆损坏。我没有从 .NET 应用程序中寻找这个的经验,但这里有一些信息:blogs.msdn.microsoft.com/calvin_hsia/2015/01/30/… c0000374 这是STATUS_HEAP_CORRUPTION。应用程序错误。与 ntdll.dll 无关 很难诊断,因为错误只会在问题发生很久之后才会出现。你最好的希望是尝试Time Travel Debugging。这使您可以及时返回并确定谁最后写信给错误地址。 NTDLL 只是煤矿里的金丝雀,它并没有造成这种非常非常严重的事故。堆损坏通常是由非托管代码引起的。我们从您之前的问题中知道您使用了很多它,如果您回答了这个问题,那么我们可能会更好地猜测原因。使用 AppVerifier 实用程序,如果幸运的话,可能会弹出一些东西。 这个没有任何可重现代码的问题是题外话,应该关闭,因为它会导致猜测并且无法正确回答。 【参考方案1】:

要调试此类系统内部问题,建议您尝试Process Monitor。

Process Monitor 是用于 Windows 的高级监控工具,可显示实时文件系统、注册表和进程/线程活动。

基本上,您需要注意“NAME NOT FOUND”错误,这意味着缺少 dll 或注册表项,或监视器屏幕中的任何其他可疑错误。

【讨论】:

这个答案是因为我的赏金而自动选择的【参考方案2】:

上一次我的应用程序发生类似的崩溃,指出 ntdll.dll 是错误模块,现实情况是我自己的代码存在内存泄漏。我对未分配内存的字符串执行了 strcpy。类似的,

char * str;
strcpy(str, "Hello");

在对我的代码进行了艰苦的演练后,我发现了这一点。

检查您的代码是否有泄漏。

【讨论】:

谢谢。我确实发现了一些潜在的内存泄漏,但它仍然会发生。我会继续寻找

以上是关于与 ntdll.dll 相关的无法解释的崩溃的主要内容,如果未能解决你的问题,请参考以下文章

java与ntdll.dll的关系

.NET Windows 服务在 ntdll.dll 中崩溃

Qt Creator 在尝试运行 OpenCV 程序时崩溃。 [ntdll.dll 崩溃]

MFC 应用程序在 NTDLL.dll 中崩溃

安装 IE9 后 Visual Studio 2012 崩溃(故障模块 ntdll.dll)

“C:\Windows\SysWOW64\ntdll.dll”。无法查找或打开PDB文件的原因?