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

本文关键字:net 原生 符号 Windbg 获取 | 更新日期: 2023-09-27 18:11:11

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

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

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

000007fb`68660000 000007fb`68993000   System_Data_Linq_ni C (pdb symbols)          C:'Program Files'Debugging Tools for Windows (x64)'sym'System.Data.Linq.pdb'703A918D116A4558BB44245924371ACD1'System.Data.Linq.pdb
    Loaded symbol image file: System.Data.Linq.ni.dll
    Image path: C:'Windows'assembly'NativeImages_v4.0.30319_64'System.Data.Linq'acbd568cd3c2499fbb7b2639c4a46a81'System.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

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

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

获取dmp的机器上创建PDB。
ngen createpdb C:'Windows'assembly'NativeImages_v4.0.30319_32'System.Data.Linq'
f989891b3a507d4aaec44ab1df12e9d5'System.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存档中搜索这些文件

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