【问题标题】:Is the documentation for WinDbg SRV* wrong?WinDbg SRV* 的文档是否错误?
【发布时间】:2016-10-31 09:00:41
【问题描述】:

documentation 说:

如果在符号路径中包含字符串 srv*,调试器将使用 一个符号服务器,用于从默认符号存储中获取符号。为了 例如,以下命令告诉调试器使用符号 服务器从默认符号存储中获取符号。 这些符号是 未缓存在本地计算机上

.sympath srv*

但是我发现符号缓存了。

我使用的是 WinDbg 10,默认缓存文件似乎是在 C:\Program Files (x86)\Windows Kits\10\Debuggers\x86\sym 创建的。当我删除它们并运行路径设置为 srv* 的可执行文件时,符号会在此处下载。

那么文档有错吗?

【问题讨论】:

  • 至少你的解释已经被你证明是错误的。

标签: c++ windbg


【解决方案1】:

是的,文档是错误的(至少对于 WinDbg 6.2.9200.16384)。

您可以通过输入上述命令来证明这一点:

0:000> .sympath srv*
Symbol search path is: srv*
Expanded Symbol search path is: cache*;SRV*http://msdl.microsoft.com/download/symbols

所以,正如我们从 WinDbg 的输出中看到的,扩展符号路径(将实际使用)包含 cache*,表示将缓存符号。

您在documentation for WinDbg 中找到了这个,这可能不是定义行为的正确位置,因为 WinDbg 本身不加载符号。相反,它使用dbghelp.dll,并且该 DLL 的行为可能会在没有更新 WinDbg 帮助的情况下发生变化。


符号路径语法真的很难习惯,而且文档遍布各处。扩展和默认目录的所有魔力使情况变得更糟。

流量或多或少:

  1. 在“;”处分割符号路径放入数组元素
  2. 对于 elements 中的每个 element
    1. 根据元素的开头切换:
      1. “缓存*”:
        1. 确定缓存路径:
          1. 如果星号后有路径,请使用该路径。
            否则使用默认缓存路径。
          2. 缓存此路径中所有以下元素的符号。
      2. “symsrv*”:
        1. 将“*”处的元素拆分为(主要是路径)组件。
        2. 第一个组件是要使用的符号服务器 DLL。
        3. 接下来的组件是路径。对于每个路径
          1. 路径中寻找符号。路径可以是以下之一
            • 本地目录。
            • UNC.
            • HTTP 或 HTTPS URL - 必须是最后一个路径
            • 空字符串 - 表示默认符号存储。 (参见SymSetHomeDirectory!homedir。)
          2. 如果找到:
            1. 将符号复制到此元素中的所有之前的路径
            2. 完成符号搜索
      3. “srv*”:
        • 与“symsrv*symsrv.dll*”相同。
      4. 否则:
        1. 元素视为路径并在其中查找符号。 (没有 symsrv.dll 所做的哈希等。)

【讨论】:

  • 有道理,即使这条消息DBGHELP: Symbol Search Path: cache*;SRV*https://msdl.microsoft.com/download/symbols 也显示cache 但扩展路径到底是什么?所以srv* 本身就是一种特殊的路径符号?
  • 完全同意symbol path syntax is really hard to get used to,非常混乱,含义和变体太多。
  • 您可以有更多的 3 个项目,用星号分隔。例如,我的符号路径包含(除其他外):SRV*D:\Symbols\Microsoft\*\\smb\PublicSymbols\Microsoft\*http://msdl.microsoft.com/download/symbols;SRV*D:\Symbols\Chromium\*\\smb\PublicSymbols\Chromium\*https://chromium-browser-symsrv.commondatastorage.googleapis.com;,因为我认为每个团队成员只为自己下载一个 800MB PDB 而不是共享它是一种浪费。另一个(深奥的)原因是如果您使用自定义 symsrv DLL。
  • @conio:谢谢。我打算对符号路径语法提出一个一般性的问题,然后再参考它。通过您的编辑,这可能不再需要(可能出于 Google 原因除外)。设置符号 (stackoverflow.com/questions/30019889/…) 是其中的一部分,但解释符号路径可能仍然值得提出自己的问题。应该包括一些像你这样的例子。
  • @ThomasWeller:这里还有很多内容没有涉及。例如,当搜索“标准路径元素”(非符号服务器)时,搜索给定路径,然后是 path\symbols,然后是 path\symbols\dlldll 是文件扩展名)。我不想过多地更改您的答案或添加太多无关信息。
【解决方案2】:

如果您在 WinDbg 符号路径中使用 special cache*path token,WinDbg 将缓存来自该令牌之后源的符号。也可以将srv*localpath*serverpath 写入缓存serverpathlocalpath 的符号。如果您不想缓存,请确保您的 .sympath 不包含它。

此外,检查符号是否被有效缓存(获取一次,重复使用多次)或仅存储在那里以用于此 WinDbg 运行(每个会话获取一次)可能是值得的。

【讨论】:

  • 它本质上是被缓存的,只被获取一次并且它永远在那里。随后的.reloads 很快。如果我再次删除此文件夹内容,.reload 在实际获取符号时会更慢。
猜你喜欢
  • 2011-04-01
  • 2021-05-07
  • 1970-01-01
  • 2010-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-30
相关资源
最近更新 更多