在安装时在.NET托管应用程序上执行ngen,并从应用程序的Windows错误报告中检索崩溃转储时,如何使用它来查看堆栈跟踪,变量等。?
以下是与该问题相关的一些背景知识:我们有一个.NET应用程序,可以在安装时获得。当由于未处理的.NET异常而崩溃时,崩溃将在Windows错误报告中进行存储,从中我可以从winqual.microsoft.com下载minidump.mdmp文件。
我将minidump.mdmp放在一个包含.dbg文件的文件夹中,用于构建崩溃的应用程序,然后双击minidump.mdmp在VS2008 SP1的新实例中打开它。我的堆栈跟踪如下所示:
kernel32.dll!RaiseException()+ 0x3d bytes
mscorwks.dll!RaiseTheExceptionInternalOnly()+ 0x295 bytes
mscorwks.dll!JIT_Throw()+ 0x130字节
MyApp.ni.exe!000007feee74c84c()
[下面的框架可能不正确和/或缺失,没有为MyApp.ni.exe加载符号]
0000000070000d5e()
MyApp.ni.exe!000007feee611000()
000000000300bf78()
000000000300bf60()
“模块”窗口指示为OS和.NET DLL加载了符号,但是对于应用程序模块,我得到了:
MyApp.exe - >符号文件中没有原生符号。
MyApp.ni.exe - >找不到匹配的二进制文件 MyAppsLibrary.ni.dll - >找不到匹配的二进制文
答案 0 :(得分:3)
调试这些转储的最简单方法是使用Windows调试器(Windbg,cdb或ntsd)并加载SOS调试器扩展(您可以搜索SOS以获取更多详细信息)。
据我记忆,只要你拥有原始的EXE和符号,NGEN的部分内容对SOS来说无关紧要(因为它是你的app,我希望你有非ngen'ed exe和符号)。
答案 1 :(得分:1)
“Windows调试工具”(特别是WinDBG)对托管应用程序的支持有限。提供PDB,您应该能够看到调用堆栈,包括源代码行引用。要查看变量值,您需要使用SOS插件,这在打开调用堆栈窗口时更加困难。
答案 2 :(得分:1)
如果您能够请求客户再次运行您的应用,请让他们使用以下环境变量集运行它:COMPLUS_ZapDisable = 1 这样CLR就不会在运行你的应用程序时加载本机图像,你会看到你的常用模块在堆栈上有符号。
答案 3 :(得分:0)
答案 4 :(得分:0)
由于这是托管代码,您可能需要将_NT_EXECUTABLE_IMAGE_PATH环境变量设置为指向可执行文件所在的文件夹。在这种情况下,您需要在NativeImage缓存中找到指向程序集的文件夹。调试器需要图像才能加载程序集。