我有一个在Azure云服务中运行的控制台应用程序,它会随机崩溃,因此我开始使用依赖walker来分析它,看看我是否可以获得更多信息。
它是一个托管代码控制台应用程序,但它加载第三方非托管代码,这是崩溃的部分,它只关闭控制台而没有任何信息原因。
当我使用依赖walker运行它时,我无法让它崩溃,它在控制台应用程序在依赖walker中作为配置文件应用程序运行并且只是运行它时会有什么不同?
我能够在事件查看器中找到一些信息。
Faulting application name: runner.exe, version: 1.0.0.0, time stamp: 0x539fe538
Faulting module name: ntdll.dll, version: 6.3.9600.17114, time stamp: 0x53649e73
Exception code: 0xc0000374
Fault offset: 0x00000000000f87a8
Faulting process id: 0xdf8
Faulting application start time: 0x01cf8a16e42e087f
Faulting application path: D:\Users\pksorensen\Desktop\Release\runner.exe
Faulting module path: D:\Windows\SYSTEM32\ntdll.dll
Report Id: 3a46b49a-f60a-11e3-80bb-00155d871170
Faulting package full name:
Faulting package-relative application ID:
答案 0 :(得分:0)
0xc000374错误代码意味着堆损坏,这是尝试调试的一个特别困难的问题。通常,当托管代码将对象或内存地址传递给非托管代码并且托管代码未固定内存或非托管代码具有覆盖其不拥有的内存的错误时,会导致此问题。您应该检查所有托管到非托管转换的代码,并确保正确处理内存和对象引用。要进行故障排除,您可以从Why is ntdll.dll crashing my c++ executable?处的Application Verifier开始。
如果这没有帮助,那么您将需要启用Pageheap,然后附加调试器以查找第一次机会异常。有几个博客可以帮助完成此步骤,但正如您所看到的那样,故障排除并非易事。