代码之家  ›  专栏  ›  技术社区  ›  Edward Brey

如何调试“ngen”ed映像的WER小型转储

  •  8
  • Edward Brey  · 技术社区  · 16 年前

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

    以下是与这个问题相关的一些背景资料:我们有一个.NET应用程序在安装时就可以使用了。当它由于未处理的.NET异常而崩溃时,崩溃会在Windows错误报告中得到补偿,从中我可以从winqual.microsoft.com下载minidump.mdmp文件。

    我把minidump.mdmp放在一个包含.dbg文件的文件夹中,以便生成崩溃的应用程序,然后双击minidump.mdmp在VS2008 SP1的新实例中打开它。我的堆栈跟踪如下:

    KNEL32.DLL!raiseException()+0x3d字节
    MySkWK.DLL!raiseExceptionInternalOnly()+0x295字节
    MySkWK.DLL!jit_throw()+0x130字节
    MyAPP.N.EXE!000007FEEE74C84C()号
    [下面的帧可能不正确和/或丢失,没有为myapp.ni.exe加载符号]
    0000000070000D5E()号
    MyAPP.N.EXE!(警敌)[r]
    00000000300BF78()。
    00000000300BF60()。

    “模块”窗口指示已为OS和.NET DLL加载符号,但对于应用程序模块,我得到:

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

    5 回复  |  直到 15 年前
        1
  •  3
  •   Remi Lemarchand    16 年前

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

    据我所知,只要你有原始的exe和符号(因为它是你的应用程序,我希望你有非ngen'ed的exe和符号),那么对sos来说,ngen'ed部分就不重要了。

        2
  •  1
  •   Jonathan    16 年前

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

        3
  •  1
  •   Kirill Osenkov    15 年前

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

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

        4
  •  0
  •   Community Mohan Dere    9 年前

    这对你有帮助吗?

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

        5
  •  0
  •   nithins    16 年前

    由于这是托管代码,因此您可能需要设置“NT”可执行映像路径环境变量,以指向可执行文件所在的文件夹。在本例中,您需要在指向程序集的NativeImage缓存中找到该文件夹。调试器需要图像才能加载程序集。

    推荐文章