我有一个使用WPF的混合模式C++/CLI应用程序。来自客户的崩溃报告为对我们自己服务器的小型转储。
当我尝试使用windbg sos-extension中的!pe或!clrstack命令调查小型转储时,
我经常从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:\Symbols * http://msdl.microsoft.com/download/symbols
作为windbg符号和图像路径。
据我了解,仅当发生崩溃的计算机和带有调试器的计算机在Windows版本方面有所不同时,.NET native 镜像才会发生这种情况,
.NET版本的SP。我主要在WPF native 图像中看到它。
我应该怎么做才能避免这个问题?
更新到我的第一个问题:
我忘了提一下,我在使用不同的mscordacwks dll版本遇到类似问题时遇到了麻烦。
为了使用SOS,在调试计算机上需要崩溃计算机上使用的mscordacwks.dll版本。
因此,我开始从不同的Windows和SP组合中收集该dll的各种版本,并将它们放在我们自己的符号服务器上。
当然,这非常尴尬,甚至更是如此,因为它们需要按照特殊约定进行命名(例如mscordacwks_x86_x86_2.0.50727.4952.dll)。
如果我从下面正确地理解了Rick的答案,则必须对我们引用的.NET程序集的 native 镜像执行类似的操作。
我已经通过一个示例(WindowsBase.ni.dll)手动尝试了此操作,但无法轻松地将此dll存储在我们的符号服务器上。似乎 native 镜像不是
被symstore理解。来自符号库的错误消息是:
SYMSTORE MESSAGE: Skipping file .\WindowsBase.ni.dll - not a known file type.
因此,我尝试将其放入一个附加目录中,并将其添加到我的符号或图像路径中,然后SOS正确解码了WindowsBase_ni帧。
但是,所有这些似乎很烦人的手动设置工作:获取各种.NET版本的所有 native 镜像(有关SP和安全更新的信息),
手动设置调试器,因为无法使用symstore,...
这真的是唯一的方法吗?
如果您可以控制客户的环境,则可能不是一个问题。但这似乎是事后调试的噩梦
适用于为大型用户群构建混合模式应用程序的组织。
最佳答案
符号服务器输出显示,在下载图像而不是这些图像的符号时遇到问题。尽管Microsoft非常擅长确保将所有已发布文件的符号放到符号服务器上,但在这种情况下DLL本身不是。
WinDbg除了符号外还需要原始DLL的原因是,为了使小型转储保持较小,大部分内存镜像都被省去了。在这种情况下,创建小型转储的计算机使用的.NET框架版本与运行WinDbg的计算机上安装的版本不同。假设崩溃的计算机具有运行Windows XP的.NET3.5,而分析计算机是运行在Windows 7上的.NET3.5。您可能会认为它们是同一版本,但Windows 7拥有它自己的.NET3.5特殊版本。如此处所示:
解决方案是将无法从符号服务器加载的DLL放在符号路径上的某个位置。但是,我看不到直接下载和安装所需的特定.NET版本的引用程序集的直接方法。但是,由于您暗示
.loadby sos mscorwks
对您有用,因此可能是您想要的DLL已在计算机上的某个位置。首先,您需要在可以控制并在WinDbg中产生这些症状的测试计算机上创建程序的小型转储。我建议尝试Windows XP。然后使用Process Explorer在测试计算机上找到
PresentationFramework.DLL
的完整路径。然后将文件大小和日期与计算机上DLL的位置进行比较,例如:如果可以找到该文件,则将其所在的文件夹放在符号路径中。如果找不到文件,则可以从测试计算机复制丢失的文件。这并不像听起来那样糟糕,因为.NET框架的发布版本并不多。
关于.net - 当涉及(WPF) native 镜像时,如何获得混合模式小型转储的完整堆栈跟踪?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4585149/