为Windbg获取正确的.net原生符号



我正在做一些崩溃转储调试,我正在查看从生产服务器获取的转储。我运行WinDbg的机器必须安装了一个稍微不同的。net运行时版本——我在加载。net系统程序集的本地映像时出现错误(因此无法加载例如System.Data.Linq)。

确保我的调试机能够访问所有正确的符号的最佳方法是什么?

编辑为Thomas Weller增加了lmv的输出

000007fb`68660000 000007fb`68993000   System_Data_Linq_ni C (pdb symbols)          C:Program FilesDebugging Tools for Windows (x64)symSystem.Data.Linq.pdb703A918D116A4558BB44245924371ACD1System.Data.Linq.pdb
    Loaded symbol image file: System.Data.Linq.ni.dll
    Image path: C:WindowsassemblyNativeImages_v4.0.30319_64System.Data.Linqacbd568cd3c2499fbb7b2639c4a46a81System.Data.Linq.ni.dll
    Image name: System.Data.Linq.ni.dll
    Has CLR image header, track-debug-data flag not set
    Timestamp:        Fri Apr 11 20:41:26 2014 (534899C6)
    CheckSum:         00000000
    ImageSize:        00333000
    File version:     4.0.30319.34209
    Product version:  4.0.30319.34209
    File flags:       0 (Mask 3F)
    File OS:          4 Unknown Win32
    File type:        2.0 Dll
    File date:        00000000.00000000
    Translations:     0000.04b0 0000.04e4 0409.04b0 0409.04e4

名称中的ni表明这是本机版本(ngen优化),因机器而异。您必须在使用ngen:

获取dmp的机器上创建PDB。
ngen createpdb C:WindowsassemblyNativeImages_v4.0.30319_32System.Data.Linq
f989891b3a507d4aaec44ab1df12e9d5System.Data.Linq.ni.dll c:symbols /debug

现在将C:symbols中的PDBs添加到Windbgs符号路径中。

您可以通过以下命令让WINDBG从Microsoft服务器下载官方符号:

.sympath srv*c:symbols*http://msdl.microsoft.com/download/symbols
.reload /f

这将把从服务器下载的符号存储在C:Symbols的本地缓存中,然后强制重新加载所有当前加载的模块的符号。

对于。net有一些事情需要考虑:

    确保你有一个良好的。net转储,即64位进程的64位转储或32位进程的32位转储。如果lm m wow64显示一个模块,它不是一个"好的"转储。
  1. 设置符号,至少.symfix c:symbols.reload
  2. 从原PC获取. net调试文件(SOS.dll和mscordacwks.dll)并相应地重命名。详见另一个答案

    我的免费工具Mscordacwks Collector会为你做这些,包括重命名。

    如果那台电脑不再可用,你可能需要在我的mscordacwks和SOS存档中搜索这些文件

    免责声明:我是这些的作者,如果这还不够清楚的话。

相关内容

  • 没有找到相关文章

最新更新