4

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

3 回答 3

9

名称中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 符号路径。

于 2015-09-05T05:52:03.133 回答
3

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

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

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

于 2015-09-04T19:40:13.120 回答
2

.NET 需要考虑一些事项:

  1. 确保您有一个良好的 .NET 转储,即 64 位进程的 64 位转储或 32 位进程的 32 位转储。如果lm m wow64显示一个模块,它不是一个“好”的转储。
  2. 设置符号,至少.symfix c:\symbols.reload
  3. 从原始 PC 获取 .NET 调试文件(SOS.dll 和 mscordacwks.dll)并相应地重命名它们。请参阅另一个答案中的详细信息。

    我的免费软件工具Mscordacwks Collector将为您完成这项工作,包括重命名。

    如果该 PC 不再可用,您可能需要在我的mscordacwks 和 SOS 存档中搜索这些文件

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

于 2015-09-04T20:19:29.130 回答