【问题标题】:Windbg loads symbols from an altered locationWindbg 从更改的位置加载符号
【发布时间】:2017-03-14 09:35:34
【问题描述】:

使用符号窗口 (CTRL + S),我已将 WinDbg 设置为从特定位置加载我的符号。

现在,当我附加调试器并尝试查看堆栈窗口时,似乎符号并未真正正确加载。

现在,当我使用 !sym noise 命令和 .reload /f 时,我会从调试器中获得以下信息:

那么,从第三张图来看,为什么还要定义 SYMSRV?为什么要在文件末尾添加 GUID 前缀?

如果不是 guid windbg 添加到路径中,它会起作用。我做错了什么。

编辑:进一步查看日志后,我看到调试器尝试从本地驱动器加载符号。

【问题讨论】:

  • Windbg 预设了一些默认搜索路径,如果在首选路径中找不到符号,它将始终在这些路径中查找符号,这是什么问题
  • @blabb,如前所述,我已经定义了符号的路径并验证通过网络访问是合理的。但根据日志,windbg 将 GUID 附加到文件名(我相信它会尝试使用 Windows 的符号服务器下载它)
  • .sympath 的输出是什么?
  • 目录到符号路径的格式是基于irr/modname/guid/actualsymbolfile。即可以是x:/foo/myspecsym/blah.pdb/123456vvvvxxxx/blah.pdb

标签: c++ windbg symbols debug-symbols


【解决方案1】:

有几种不同的格式可以存储符号。这些是 0 层、2 层和 3 层。

0-tier 基本上是一个平面文件列表,如果您刚刚构建了您的程序并且所有 PDB 都位于一个文件夹中,则该列表非常适合。如果您输入像 c:\path 这样的本地路径或像 \\server 这样的服务器共享,WinDbg 应该考虑 0 层存储布局,但也可以尝试其他方式。

问题是您只能将一个版本的 PDB 存储在 0 层存储中,这就是存在 2 层和 3 层符号存储的原因。将符号添加到此类存储时,它会考虑 GUID,因此可以存储同一程序的多个版本。 2 层和 3 层符号存储应以 srv* 开头。 2 层和 3 层商店之间的确切区别在第 9 频道 episode 87 中进行了解释,并且可以将 2 层商店 convert 2 层商店变成 3 层商店。

不要将srv* 符号路径语法与SYMSRV: 调试输出混淆。恕我直言,SYMSRV: 只是symsrv.dll 的调试消息,因此无需担心。

关于加载符号的真相只能用Process Monitor来监控。并非所有 WinDbg 搜索符号的位置都被记录下来,即使在嘈杂模式下也是如此。

除了符号路径之外,DLL 还包含对 PDB 的本地路径的引用,WinDbg 将考虑此路径,而与符号路径设置无关。

【讨论】:

  • 也许(我从未尝试过)您可以通过设置 .symopt+ 0x80 (SYMOPT_IGNORE_CVREC) 来禁用从 DLL 路径加载
猜你喜欢
  • 1970-01-01
  • 2015-01-02
  • 2016-12-25
  • 1970-01-01
  • 2011-11-06
  • 2015-02-18
  • 2012-06-14
  • 2020-07-19
  • 1970-01-01
相关资源
最近更新 更多