如何在 WinDbg 中设置符号?
How to set up symbols in WinDbg?
我正在使用 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.[= 中所有 错误符号 帖子的规范问题18=]
可以通过各种不同的方式正确设置符号。
警告:此处的示例使用 \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[=107 设置符号路径=].您按以下格式输入
c:\mysymbols;cache*c:\symbolcache;\server\symbols;SRV*c:\symbols*http://msdl.microsoft.com/download/symbols
通过命令行修复符号
WinDbg 也采用 -y
命令行开关,如果您喜欢使用具有不同符号路径设置的不同桌面 link。
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 创建一个 link 以包含 -Q
,这意味着“抑制恼人的 "Save workspace?" 问题”。
到目前为止,我很高兴将符号保存为 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 (should redirect here 但重定向目前已中断)
打开转储文件后,单击文件,select 符号文件路径或 (Ctrl+S)。此打开的框显示由环境变量 _NT_SYMBOL_PATH
设置的默认路径。
就我而言,这表明:
SRV*C:\symcache*http://msdl.microsoft.com/download/symbols
- 在“;”之前插入您的本地符号路径在任何条目之后。
- Select 重新加载框。
- 单击“确定”。
- 在命令提示符 运行 中:
ld*
- 等待符号加载。
我正在使用 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.[= 中所有 错误符号 帖子的规范问题18=]
可以通过各种不同的方式正确设置符号。
警告:此处的示例使用 \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[=107 设置符号路径=].您按以下格式输入
c:\mysymbols;cache*c:\symbolcache;\server\symbols;SRV*c:\symbols*http://msdl.microsoft.com/download/symbols
通过命令行修复符号
WinDbg 也采用 -y
命令行开关,如果您喜欢使用具有不同符号路径设置的不同桌面 link。
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 创建一个 link 以包含 -Q
,这意味着“抑制恼人的 "Save workspace?" 问题”。
到目前为止,我很高兴将符号保存为 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 (should redirect here 但重定向目前已中断)
打开转储文件后,单击文件,select 符号文件路径或 (Ctrl+S)。此打开的框显示由环境变量 _NT_SYMBOL_PATH
设置的默认路径。
就我而言,这表明:
SRV*C:\symcache*http://msdl.microsoft.com/download/symbols
- 在“;”之前插入您的本地符号路径在任何条目之后。
- Select 重新加载框。
- 单击“确定”。
- 在命令提示符 运行 中:
ld*
- 等待符号加载。