当涉及(WPF)本机映像时,如何获得混合模式小型转储的完整堆栈跟踪?

时间:2011-01-03 14:14:58

标签: .net wpf stack-trace sos minidump

我有一个使用WPF的混合模式C ++ / CLI应用程序。我们客户的崩溃报告为我们自己服务器的小型转储。

当我尝试使用windbg sos-extension中的!pe或!clrstack命令调查minidump时, 我经常从WPF程序集中获取堆栈帧的不完整信息,例如

SP       IP       Function
0013E370 564618E3 PresentationFramework_ni!Unknown+0x1bf
0013E3A4 56461258 PresentationFramework_ni!Unknown+0x58
0013E3CC 5634C6D8 PresentationFramework_ni!Unknown+0x18
0013E3D8 55C04AA2 PresentationFramework_ni!Unknown+0x502
...

在这种情况下,堆栈跟踪解码也变得非常慢。

使用!sym noisy显示以下来自

的大量消息
SYMSRV:  C:\Symbols\PresentationFramework.ni.dll\488F142Edab000\PresentationFramework.ni.dll not found
SYMSRV:  http://msdl.microsoft.com/download/symbols/PresentationFramework.ni.dll/488F142Edab000/PresentationFramework.ni.dll not found
DBGHELP: C:\Program Files (x86)\Debugging Tools for Windows (x86)\PresentationFramework.ni.dll - file not found
DBGHELP: PresentationFramework.ni.dll not found in c:\Windows\System32
SYMSRV:  C:\Symbols\PresentationFramework.ni.dll\488F142Edab000\PresentationFramework.ni.dll not found
SYMSRV:  http://msdl.microsoft.com/download/symbols/PresentationFramework.ni.dll/488F142Edab000/PresentationFramework.ni.dll not found
DBGENG:  C:\WINDOWS\assembly\NativeImages_v2.0.50727_32\PresentationFramewo#\9519494798a88867406b5755e1dbded6\PresentationFramework.ni.dll - Couldn't map image from disk.
SYMSRV:  C:\Symbols\PresentationFramework.dll\488F142E50e000\PresentationFramework.dll not found
SYMSRV:  http://msdl.microsoft.com/download/symbols/PresentationFramework.dll/488F142E50e000/PresentationFramework.dll not found
DBGHELP: C:\Program Files (x86)\Debugging Tools for Windows (x86)\PresentationFramework.dll - file not found
DBGHELP: PresentationFramework.dll not found in c:\Windows\System32
SYMSRV:  C:\Symbols\PresentationFramework.dll\488F142E50e000\PresentationFramework.dll not found
SYMSRV:  http://msdl.microsoft.com/download/symbols/PresentationFramework.dll/488F142E50e000/PresentationFramework.dll not found
DBGENG:  C:\WINDOWS\assembly\GAC_MSIL\PresentationFramework\3.0.0.0__31bf3856ad364e35\PresentationFramework.dll image header does not match memory image header.
DBGENG:  C:\WINDOWS\assembly\GAC_MSIL\PresentationFramework\3.0.0.0__31bf3856ad364e35\PresentationFramework.dll - Couldn't map image from disk.

我用过

C:\ Windows \ System32下; SRV * C:\ *符号的http://msdl.microsoft.com/download/symbols

作为windbg符号和图像路径。

据我所知,只有发生崩溃的机器和带有调试器的机器在Windows版本方面不同,才会发生.NET本机映像, .NET版本的SP。我已经看到它主要用于WPF原生图像。

我该怎么做才能避免这个问题?

更新我的初步问题:

我忘了提到我在使用不同的mscordacwks dll版本时遇到了类似的问题。 为了使用SOS,在degbugging计算机上需要在崩溃的计算机上使用的mscordacwks.dll版本。 所以我开始从不同的Windows和SP组合中收集这个dll的各种版本,并将它们放在我们自己的符号服务器上。 当然,这非常尴尬,甚至更是如此,因为它们需要按照特殊约定命名(例如mscordacwks_x86_x86_2.0.50727.4952.dll)。

如果我从下面正确理解Rick的答案,我必须为我们引用的.NET程序集的本机图像做类似的事情。 我已经尝试了一个示例(WindowsBase.ni.dll)但我无法轻松地将此dll存储在我们的符号服务器上。似乎原生图像不是 由symstore理解。来自symstore的错误消息是:

SYMSTORE MESSAGE: Skipping file .\WindowsBase.ni.dll - not a known file type.

所以我试着把它放到一个额外的目录中并将其添加到我的符号或图像路径中,然后SOS正确解码了WindowsBase_ni帧。

但所有这些看起来像很烦人的手动设置工作:获取各种.NET版本的所有本机映像(SP和安全更新), 手动设置调试器,因为无法使用symstore,...

这真的是唯一的方法吗?

如果您可以控制客户的环境,那可能不是一个问题。但它似乎是一个验尸调试的噩梦 用于为大型用户群构建混合模式应用程序的组织。

2 个答案:

答案 0 :(得分:5)

符号服务器输出显示无法为这些图像下载图像,而不是符号。虽然微软非常擅长确保将所有已发布文件的符号放在符号服务器上,但在这种情况下,DLL本身并非如此。

WinDbg除了符号之外还想要原始DLL的原因是因为为了使minidump保持较小,大部分内存图像都被省略了。在这种情况下,创建minidump的计算机使用的是不同版本的.NET框架,而不是安装在运行WinDbg的计算机上。让我们说崩溃的计算机运行Windows XP的.NET3.5和分析计算机是在Windows 7上运行的.NET3.5。你会认为它们是相同的版本,但Windows 7有它自己的特殊版本的.NET3.5从这里可以看出:

解决方案是将无法从符号服务器加载的DLL放在符号路径上的某个位置。但是,我没有看到直接下载和安装所需特定.NET版本的引用程序集的简单方法。但既然你暗示.loadby sos mscorwks为你工作,那么你想要的DLL可能已经在某个地方的计算机上了。

首先,您需要在可以控制的测试计算机上创建程序的minidump,以便在WinDbg中产生这些症状。我建议尝试Windows XP。然后使用Process Explorer查找测试计算机上PresentationFramework.DLL的完整路径。然后将文件大小和日期与计算机上的DLL进行比较,例如:

  • C:\的Windows \ Microsoft.NET
  • C:\ Program Files(x86)\ Reference Assemblies \ Microsoft \ Framework
  • C:\ Program Files \ Reference Assemblies \ Microsoft \ Framework

如果您可以找到该文件,则将其找到的文件夹放在您的符号路径中。如果找不到该文件,则可以从测试计算机中复制丢失的文件。这并不像听起来那么糟糕,因为.NET框架的发布版本不多。

答案 1 :(得分:1)

它可能是JITed代码,在这种情况下,在加载sos之后,您可以使用!IP2MD命令获取函数的名称(通过IP):

SP       IP       Function
0013E370 564618E3 PresentationFramework_ni!Unknown+0x1bf
...

>!IP2MD 564618E3