如何在windbg中设置符号



我正在使用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以找到符号?

免责声明:这是对所有错误符号帖子的规范问题。

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

警告:此处使用的示例使用\serversymbols,通常是一个网络存储,无法可用。将其调整到您的本地服务器上,或者如果没有该服务器,则将其完全遗漏。不存在的服务器可能会导致延迟等。

tldr版本的80%

为Microsoft提供的符号创建一个新文件夹c:symbols。然后键入

.symfix+ c:symbols
.reload

(或者必要时reload -f

确保您有互联网连接,因为这将联系一些Microsoft服务器并从那里下载符号。

在80%以上的情况下,这可能已经解决了您的符号问题。如果没有,请继续阅读。

命令修复符号

windbg将以出现在符号路径中的顺序寻找符号。因此,最好将您的本地符号放在首位,然后将某些公司本地网络共享,然后从Internet下载符号并在本地存储副本。

.sympath c:mysymbols ; *** Symbols of your application, locally, flat list of PDB files
.sympath+ cache*c:symbolcache ; *** (optional) Create a cache for everything
.sympath+ \serversymbols ; *** Symbols provided from a network share
.symfix+ c:symbols ; *** Microsoft symbols

菜单修复符号

在windbg中(而不是命令行等效),您可以通过File/Symbol File Path...设置符号路径,也可以按 ctrl s 。您以以下格式输入它

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

命令行修复符号

windbg还会采用-y命令行开关,如果您喜欢具有不同符号路径设置的其他桌面链接。

WinDbg -y "<symbol path>"

请注意,您需要此处的完整路径,该路径是

之类的形式
c:mysymbols;cache*c:symbolcache;\serversymbols;SRV*c:symbols*http://msdl.microsoft.com/download/symbols

通过环境变量修复符号

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

c:mysymbols;cache*c:symbolcache;\serversymbols;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>

如果您在网络共享中访问符号遇到困难,请确保您以前登录到网络共享。afair,windbg不要求凭证。

官方文档

使用Microsoft符号服务器获取调试符号文件(应该在此处重定向,但重定向已损坏)

Windows Debugger的符号路径

打开转储文件后,单击文件,选择符号文件路径或(ctrl s)。此打开框显示环境设置的默认路径可变_NT_SYMBOL_PATH。就我而言,这显示了:

SRV*C:symcache*http://msdl.microsoft.com/download/symbols
  1. 在之前插入您的本地符号路径和";任何条目后。
  2. 选择重新加载框。
  3. 单击确定。
  4. 在命令提示中运行:ld*
  5. 等待符号加载。

最新更新