如何在WinDbg中设置符号?

Tho*_*ler 36 debugging windbg debug-symbols

我正在使用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. *
****************************************************************************
Run Code Online (Sandbox Code Playgroud)

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

*** ERROR: Module load completed but symbols could not be loaded for <module>.<ext>
Run Code Online (Sandbox Code Playgroud)

以下似乎是相关的:

*********************************************************************
* 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+                                      *
*********************************************************************
Run Code Online (Sandbox Code Playgroud)

!analyze -v我还看到

DEFAULT_BUCKET_ID:  WRONG_SYMBOLS
Run Code Online (Sandbox Code Playgroud)

*************************************************************************
***                                                                   ***
*** 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.                                                             ***
***                                                                   ***
*************************************************************************
Run Code Online (Sandbox Code Playgroud)

如何设置WinDbg以查找符号?

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

Tho*_*ler 66

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

警告:此处使用的示例\\server\symbols通常是不可用的网络存储.如果您没有,请将其调整到本地服务器或完全保留该部分.不存在的服务器可能会导致延迟等.

TLDR版本占80%的案例

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

.symfix+ c:\symbols
.reload
Run Code Online (Sandbox Code Playgroud)

(或reload -f必要时)

确保您有Internet连接,因为这将联系某些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+ \\server\symbols ; *** Symbols provided from a network share
.symfix+ c:\symbols ; *** Microsoft symbols
Run Code Online (Sandbox Code Playgroud)

通过菜单修复符号

在WinDbg中(但不是命令行等效项),您可以设置符号路径File/Symbol File Path...或按Ctrl+ S.您可以使用以下格式输入它

c:\mysymbols;cache*c:\symbolcache;\\server\symbols;SRV*c:\symbols*http://msdl.microsoft.com/download/symbols
Run Code Online (Sandbox Code Playgroud)

通过命令行修复符号

-y如果您希望使用具有不同符号路径设置的不同桌面链接,WinDbg也会使用命令行开关.

WinDbg -y "<symbol path>"
Run Code Online (Sandbox Code Playgroud)

请注意,您需要这里的完整路径,其形式如下

c:\mysymbols;cache*c:\symbolcache;\\server\symbols;SRV*c:\symbols*http://msdl.microsoft.com/download/symbols
Run Code Online (Sandbox Code Playgroud)

通过环境变量修复符号

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

c:\mysymbols;cache*c:\symbolcache;\\server\symbols;SRV*c:\symbols*http://msdl.microsoft.com/download/symbols
Run Code Online (Sandbox Code Playgroud)

请注意,不仅WinDbg会评估此变量,还会评估Visual Studio,Process Explorer,Process Monitor以及其他可能的软件.您可能会遇到设置此环境变量的性能影响.

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

如果您有一个相当复杂的符​​号设置,其中包含多个路径,请熟悉WinDbg工作区概念.

工作区允许您保存符号路径,因此您不必在每个调试会话中重新键入所有命令.

一旦您对工作区感到满意,请为WinDbg创建一个链接,-Q这意味着"抑制烦人的"保存工作区?"问题".

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

延期符号

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

ld*
Run Code Online (Sandbox Code Playgroud)

调试符号问题

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

!sym noisy
Run Code Online (Sandbox Code Playgroud)

获取有关解析符号时WinDbg正在做什么的更多信息.

找到解决方案后,请将其关闭

!sym quiet
Run Code Online (Sandbox Code Playgroud)

要检查单个符号的正确性,可以使用symchkWinDbg附带的工具.

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
Run Code Online (Sandbox Code Playgroud)

或者获得更容易使用的ChkMatch

ChkMatch -c <exe file> <pdb file>
Run Code Online (Sandbox Code Playgroud)

如果您无法从网络共享访问符号,请确保之前已登录到网络共享.AFAIR,WinDbg不要求凭据.

官方文件

使用Microsoft Symbol Server获取调试符号文件(应在此处重定向,但目前已重定向)

Windows调试程序的符号路径


lsa*_*mon 5

打开转储文件后,单击文件,选择符号文件路径或 (Ctrl+S)。这个打开的框显示了环境变量设置的默认路径_NT_SYMBOL_PATH。就我而言,这表明:

SRV*C:\symcache*http://msdl.microsoft.com/download/symbols
Run Code Online (Sandbox Code Playgroud)
  1. 在“;”之前插入您的本地符号路径 任何进入后。
  2. 选择重新加载框。
  3. 单击确定。
  4. 在命令提示符下运行: ld*
  5. 等待符号加载。