如何在 WinDbg 中设置符号?

Posted

技术标签:

【中文标题】如何在 WinDbg 中设置符号?【英文标题】:How to set up symbols in WinDbg? 【发布时间】:2015-07-13 05:37:22 【问题描述】:

我正在使用Debugging Tools for 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 来查找符号?

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

【问题讨论】:

【参考方案1】:

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

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

80% 案例的 TLDR 版本

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

.symfix+ c:\symbols
.reload

(或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

通过菜单修复符号

在 WinDbg(但不是命令行等效项)中,您可以通过 File/Symbol File Path... 或按 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 和可能的其他软件。设置此环境变量可能会影响性能。

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

如果您有一个包含多个路径的相当复杂的符​​号设置,请熟悉concept of WinDbg workspaces。

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

一旦您对工作区感到满意,请为 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 不要求提供凭据。

官方文档

Use the Microsoft Symbol Server to obtain debug symbol files(应该是redirect here,但重定向当前已中断)

Symbol path for Windows debuggers

【讨论】:

@Techrocket9:好的,我在帖子开头添加了该信息作为警告 指向 Microsoft 符号服务器的链接似乎不再起作用 @higginse:是的,这是微软方面的重定向问题。这里是目的地:support.microsoft.com/en-us/help/311503/…【参考方案2】:

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

SRV*C:\symcache*http://msdl.microsoft.com/download/symbols
    在“;”之前插入本地符号路径在任何条目之后。 选择重新加载框。 点击确定。 在命令提示符下运行:ld* 等待符号加载。

【讨论】:

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

以上是关于如何在 WinDbg 中设置符号?的主要内容,如果未能解决你的问题,请参考以下文章

如何在绝对导入中设置没有点符号的 Pypi 包 - python3

如何在word文档中设置手指型图标

在 html 文本框中设置键盘插入符号位置

如何在WPF中设置小扩展头和扩展内容?

如何在 s-s-rs 报告服务中设置自定义货币

如何“在 malloc_error_break 中设置断点进行调试”