WinDbg SRV* 的文档有误吗?

Is the documentation for WinDbg SRV* wrong?

documentation 说:

If you include the string srv* in your symbol path, the debugger uses a symbol server to get symbols from the default symbol store. For example, the following command tells the debugger to use a symbol server to get symbols from the default symbol store. These symbols are not cached on the local computer.

.sympath srv*

但是我发现符号缓存了。

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

那么文档有错吗?

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

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

是的,文档有误(至少对于 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, which might not be the correct place to define the behavior, since WinDbg does not load the symbols itself. Instead it uses the dbghelp.dll 中找到了它,并且在没有更新 WinDbg 帮助的情况下,该 DLL 的行为可能会发生变化。


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

流量或多或少:

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