8

在安装时在 .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()

Modules 窗口表明已为 OS 和 .NET DLL 加载了符号,但对于应用程序模块,我得到以下信息:

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

4

5 回答 5

3

调试这些转储的最简单方法是使用 Windows 调试器(Windbg、cdb 或 ntsd)并加载 SOS 调试器扩展(您可以搜索 SOS 以获取更多详细信息)。

据我记得,只要你有原始的 EXE 和符号,NGEN 的部分对 SOS 并不重要(因为它是你的应用程序,我希望你有非 ngen 的 exe 和符号)。

于 2009-12-14T01:11:53.723 回答
1

“Windows 调试工具”(特别是 WinDBG)对托管应用程序的支持有限。提供了 PDB,您应该能够看到调用堆栈,包括源代码行引用。要查看变量值,您需要使用 SOS 插件,这比仅打开调用堆栈窗口更加困难。

于 2009-12-05T09:47:21.410 回答
1

如果您能够请求客户端再次运行您的应用程序,请让他们使用以下环境变量集运行它: COMPLUS_ZapDisable=1 这样,CLR 在运行您的应用程序时不会加载本机图像,您将看到您的堆栈上带有符号的常用模块。

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

于 2011-02-17T01:34:35.733 回答
0

这对你有帮助吗:

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

于 2009-12-04T13:33:59.733 回答
0

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

于 2009-12-08T20:35:03.960 回答