如何在WinDbg中设置符号?

63

我正在使用Windows调试工具,当我启动WinDbg/cdb或ntsd时,会出现以下错误消息:

Symbol search path is: *** Invalid ***
****************************************************************************
* Symbol loading may be unreliable without a symbol search path.           *
* Use .symfix to have the debugger choose a symbol path.                   *
* After setting your symbol path, use .reload to refresh symbol locations. *
****************************************************************************

当执行任意命令时,我也会收到错误消息。

*** ERROR: Module load completed but symbols could not be loaded for <module>.<ext>

而以下似乎与此相关:

*********************************************************************
* Symbols can not be loaded because symbol path is not initialized. *
*                                                                   *
* The Symbol Path can be set by:                                    *
* using the _NT_SYMBOL_PATH environment variable.                   *
* using the -y <symbol_path> argument when starting the debugger.   *
* using .sympath and .sympath+                                      *
*********************************************************************

!analyze -v中,我也看到了。
DEFAULT_BUCKET_ID:  WRONG_SYMBOLS

并且

*************************************************************************
***                                                                   ***
*** Either you specified an unqualified symbol, or your debugger      ***
*** doesn't have full symbol information. Unqualified symbol          ***
*** resolution is turned off by default. Please either specify a      ***
*** fully qualified symbol module!symbolname, or enable resolution    ***
*** of unqualified symbols by typing ".symopt- 100". Note that        ***
*** enabling unqualified symbol resolution with network symbol        ***
*** server shares in the symbol path may cause the debugger to        ***
*** appear to hang for long periods of time when an incorrect         ***
*** symbol name is typed or the network symbol server is down.        ***
***                                                                   ***
*** For some commands to work properly, your symbol path              ***
*** must point to .pdb files that have full type information.         ***
***                                                                   ***
*** Certain .pdb files (such as the public OS symbols) do not         ***
*** contain the required information. Contact the group that          ***
*** provided you with these symbols if you need this command to       ***
*** work.                                                             ***
***                                                                   ***
*************************************************************************

我该如何设置WinDbg来查找符号?
免责声明:这是一个旨在回答中所有"错误符号"帖子的规范问题。
2个回答

112

符号可以以多种不同的方式正确设置。

警告: 这里的示例使用的是\\server\symbols,通常是一个不可用的网络存储。如果您没有该存储,请将其适应于您的本地服务器或完全省略该部分。不存在的服务器可能会导致延迟等问题。

80%情况下的TLDR版本

为微软提供的符号创建一个新文件夹c:\symbols。然后输入以下命令:

.symfix+ c:\symbols
.reload

请确保您已经连接到互联网,因为这将联系一些微软服务器并从那里下载符号。如果80%以上的情况下,这可能已经解决了您的符号问题。如果没有,请继续阅读。
通过命令修复符号
WinDbg将按照它们在符号路径中出现的顺序查找符号。因此,最好先放置本地符号,然后是一些公司本地网络共享,然后下载符号并在本地存储副本。
.sympath c:\mysymbols ; *** Symbols of your application, locally, flat list of PDB files
.sympath+ cache*c:\symbolcache ; *** (optional) Create a cache for everything
.sympath+ \\server\symbols ; *** Symbols provided from a network share
.symfix+ c:\symbols ; *** Microsoft symbols

通过菜单修复符号

在WinDbg中(但不是命令行等效工具),您可以通过文件/符号文件路径...或按下Ctrl+S来设置符号路径。您需要按以下格式输入:

c:\mysymbols;cache*c:\symbolcache;\\server\symbols;SRV*c:\symbols*http://msdl.microsoft.com/download/symbols

通过命令行修复符号

如果您希望使用不同的桌面链接来设置不同的符号路径,WinDbg也可以使用-y命令行开关。

WinDbg -y "<symbol path>"

请注意,您需要在此处提供完整路径,其格式类似于
c:\mysymbols;cache*c:\symbolcache;\\server\symbols;SRV*c:\symbols*http://msdl.microsoft.com/download/symbols

通过环境变量修复符号

有一个名为_NT_SYMBOL_PATH的环境变量,可以设置为符号路径。使用以下语法:

c:\mysymbols;cache*c:\symbolcache;\\server\symbols;SRV*c:\symbols*http://msdl.microsoft.com/download/symbols

请注意,不仅WinDbg会评估这个变量,Visual Studio、Process Explorer、Process Monitor和其他软件也可能会评估。设置此环境变量可能会影响性能。

将符号路径保存为工作区的一部分

如果您的符号设置比较复杂,包括几个路径,请熟悉 WinDbg工作区的概念

工作区允许您保存符号路径,这样您就不必在每次调试会话中重新输入所有命令。

一旦您对工作区满意,为WinDbg创建一个链接,包括-Q,意思是“抑制烦人的“保存工作区?”问题”。

到目前为止,我非常高兴将符号保存为Base工作区的一部分。

延迟符号

延迟符号(在lm命令期间标示为这样)不是问题。WinDbg将在需要时加载它们。要强制加载所有符号,请键入

ld*

调试符号问题

如果符号(PDB)不能按预期工作,请使用

!sym noisy

为了获取有关WinDbg在解析符号时确切执行的信息,请参考以下内容。

找到解决方案后,请使用以下命令关闭:

!sym quiet

要检查单个符号的正确性,您可以使用随 WinDbg 一起提供的 symchk 工具。

Symchk /if <exe> /s <symbol path> /av /od /pf
/if = input is a file
/s  = symbol file path
/od = all details
/av = verify
/pf = check if private symbols are available

或者获取ChkMatch,这个更容易使用一些。
ChkMatch -c <exe file> <pdb file>

如果您在从网络共享中访问符号时遇到问题,请确保您先登录到网络共享。据我所知,WinDbg不会要求凭据。
官方文档 使用Microsoft符号服务器获取调试符号文件(应该重定向到此处,但重定向目前无法正常工作) Windows调试器的符号路径

@Techrocket9:好的,我已经在帖子开头添加了该信息作为警告。 - Thomas Weller
Microsoft符号服务器的链接似乎已经失效。 - higginse
@higginse:是的,这是微软方面的重定向问题。这是目标网址:https://support.microsoft.com/en-us/help/311503/use-the-microsoft-symbol-server-to-obtain-debug-symbol-files - Thomas Weller
有人能详细解释一下 "_设置[NT_SYMBOL_PATH]环境变量可能会影响性能" 吗?我找不到任何关于这会导致什么性能问题以及原因的信息。 - Coldblackice

9
打开转储文件后,单击“文件”,选择“符号文件路径”或(Ctrl+S)。此打开框显示由环境变量_NT_SYMBOL_PATH设置的默认路径。在我的情况下,它显示为:
SRV*C:\symcache*http://msdl.microsoft.com/download/symbols
  1. 在任何条目前面和后面添加您的本地符号路径和“;”。
  2. 选择Reload框。
  3. 点击OK。
  4. 在命令提示符中运行:ld*
  5. 等待符号加载完成。

这个答案太简单了,不完整。例如,它忽略了工作区的概念,并假定您已经设置了_NT_SYMBOL_PATH。如果您打开一个转储文件,可能会加载一个工作区,该工作区已经具有完全不同的符号路径。 - Thomas Weller
1
这是我成功使用过的序列,对我来说非常有效。我通常不使用工作区。 - lsalamon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接