1

读取 Windows *.dmp 文件开始

收到来自随机客户的转储文件,运行调试会话以查看崩溃,您经常会发现它位于 MS 或其他第三方库中。下一个问题是您可能不了解 PC 设置,以至于无法确保您拥有实际可用的模块。

例如,我目前正试图为 ntdll.dll (5.01.2600.5512) 加载符号。在 MSVC 2005 中,模块列表窗口中的路径列在完整路径文件名之前显示 *,并且拒绝加载我为 XP/SP1/SP1a/SP2/SP3 下载的符号。

我有符号服务器设置,可以从 Internet 下载并存储在本地缓存中,这对于我的 PC 上的模块似乎运行良好。使用与方法等效的 GUI

设置 _NT_SYMBOL_PATH=srv*d:\SymbolCache*\\server1\Third-Party-PDB;srv*d:\SymbolCache*\\server2\Windows\Symbols*http://msdl.microsoft.com/download/symbols

也许我有错误的符号,但由于没有下载新符号,我下一步该去哪里?我是否必须联系客户并询问他们安装了哪些 SP 以及任何其他补丁?我是否必须安装那台机器,然后使用 dmp 文件运行调试器以获取我需要的符号?

4

4 回答 4

3

如果您使用的是 WinDbg(Windows 调试工具包的一部分),那么很容易让它自动从 Microsoft 为您提取正确的符号。使用“.symfix”(或“.symfix+”,以简单地附加到现有符号搜索路径)命令配置符号路径。

完成此操作并在 WinDbg 中加载故障转储后,键入“.reload /f”以使 WinDbg 重新加载符号。它将使用转储文件本身中的信息从 Microsoft 的公共符号服务器中提取正确的符号,而不管您的机器上有什么 DLL。

如果由于某种原因在您完成此操作后符号未正确加载,请在 WinDbg 的命令窗口中输入“!sym noise”并再次重新加载符号。当 WinDbg 尝试加载它们时,您将看到它输出它在搜索/加载过程中遇到的任何错误。这些错误消息将帮助您进一步诊断出了什么问题以及未加载正确符号的原因。

这篇文章包含的信息也可能有用。

于 2008-12-31T17:39:13.170 回答
1

如果您在Set _NT_SYMBOL_PATH = srv...命令提示符中键入“”,则需要考虑两件事:

  • cmd.exeset命令不会忽略空格,因此它定义了一个名为“ _NT_SYMBOL_PATH”的变量,而不是“ _NT_SYMBOL_PATH”。
  • 您必须将调试器作为该命令提示符的子项启动。setx但是,如果您使用控制面板设置持久性环境变量,或者如果您使用命令(在 Windows Vista 或 Windows 资源工具包之一中),则不必执行此操作。

如果您以其他方式设置符号路径,则不适用。

于 2009-01-05T23:55:15.240 回答
0

尝试按照此 kb 文章中的说明进行操作,并确保您的符号路径配置正确,WinDbg 可以访问它,并且 ntdll 符号(例如)实际上已下载到您的符号缓存中。本文还提供了有关如何通过 SymChk 工具手动下载和验证缓存中的符号的说明。

于 2008-12-31T16:26:30.650 回答
0

你用什么来调试小型转储?即,WinDBG 还是 Visual Studio?minidump 是如何生成的?

minidump 中应该有足够的信息来正确解析系统 dll 符号。您使用的是符号的本地下载还是http://msdl.microsoft.com/

更新:您应该能够将公共 microsoft 符号存储添加到 Tools->Options->Debugging->Symbols->Symbol file (.pdb) 位置,然后通过右键单击 Modules 窗口中的模块手动加载符号并在没有自动完成的情况下加载它们。

VS 2005 也可能(很可能)不考虑_NT_SYMBOL_PATH解析小型转储符号。

于 2008-12-31T17:15:24.153 回答