当安装时在 .NET 托管应用程序上执行 ngen 并从应用程序的 Windows 错误报告中检索故障转储时,如何使用它来查看堆栈跟踪、变量等?

以下是与该问题相关的一些背景:我们有一个在安装时生成的 .NET 应用程序。当它由于未处理的 .NET 异常而崩溃时,崩溃会记录在 Windows 错误报告中,我可以从 winqual.microsoft.com 下载 minidump.mdmp 文件。

我将 minidump.mdmp 放在包含用于构建崩溃的应用程序的 .dbg 文件的文件夹中,然后双击 minidump.mdmp 以在 VS2008 SP1 的新实例中将其打开。我的堆栈跟踪如下所示:

kernel32.dll!RaiseException() + 0x3d 字节
mscorwks.dll!RaiseTheExceptionInternalOnly() + 0x295 字节
mscorwks.dll!JIT_Throw() + 0x130 字节
MyApp.ni.exe!000007feee74c84c()
[下面的框架可能不正确和/或丢失,没有为 MyApp.ni.exe 加载任何符号]
0000000070000d5e()
MyApp.ni.exe!000007feee611000()
000000000300bf78()
000000000300bf60()

“模块”窗口指示已为操作系统和 .NET DLL 加载符号,但对于应用程序模块,我得到以下信息:

MyApp.exe -> 符号文件中没有本机符号。
MyApp.ni.exe -> 未找到匹配的二进制文件。
MyAppsLibrary.ni.dll -> 未找到匹配的二进制文件。

有帮助吗?

解决方案

调试那些转储最简单的方法是与Windows调试器(WinDBG的,CDB,或NTSD)和加载SOS调试器扩展(可以为SOS寻找更多的细节)。

据我记得,事情只要你有原来的EXE和符号(因为它是你的应用程序不应该为SOS重要的NGEN'ed一部分,我希望你有非ngen'ed exe文件和符号)。

其他提示

“Windows调试工具”(具体地,WinDBG的)具有用于管理应用程序的支持有限。与PDBS提供的,你应该能够看到调用堆栈,包括源代码行引用。要查看变量值,你就需要使用SOS插件,这是比较困难的,只是打开调用堆栈窗口。

如果你能要求客户再次运行你的应用程序,让他们用下面的环境变量设置运行它:COMPLUS_ZapDisable = 1 运行你的应用程序时,这样CLR将不会加载本地的图像,你会看到在堆栈上的符号常用的模块。

http://referencesource.microsoft.com/faq.aspx

这对您有帮助吗:

这家伙似乎能够从故障转储中加载一些符号来调试他的应用程序,在加载正确的符号时遇到问题,但有人回答了他的问题。

由于这是托管代码,您可能需要设置_NT_EXECUTABLE_IMAGE_PATH环境变量指向到你的可执行文件住的文件夹。在这种情况下,你需要找到在NativeImage缓存指向程序集的文件夹。调试器需要以加载组件中的图像。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top