为Windbg

时间:2015-09-04 19:31:45

标签: c# debugging windbg crash-dumps postmortem-debugging

我正在进行一些故障转储调试,我正在寻找从生产服务器获取的转储。我正在运行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

3 个答案:

答案 0 :(得分:7)

名称中的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

现在将PDB从C:\ symbols添加到Windbgs符号路径。

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:2)

.NET需要考虑一些事项:

  1. 确保您有good dump for .NET,即64位进程的64位转储或32位进程的32位转储。如果lm m wow64显示模块,那么它不是"好的"转储。
  2. Set up the symbols,至少.symfix c:\symbols.reload
  3. 从原始PC获取.NET调试文件(SOS.dll和mscordacwks.dll)并相应地重命名。请参阅details in another answer

    我的免费软件工具Mscordacwks Collector将为您执行此操作,包括重命名。

    如果该PC不再可用,您可能希望在我的mscordacwks and SOS archive

    中搜索这些文件

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