WinDbg SRV*的文档是错误的吗?

zar*_*zar 8 c++ windbg

文件说:

如果在符号路径中包含字符串srv*,则调试器使用符号服务器从默认符号存储中获取符号.例如,以下命令告诉调试器使用符号服务器从默认符号存储中获取符号.这些符号不会缓存在本地计算机上.

.sympath srv*

然而,我发现的是符号缓存.

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

那么文档错了吗?

Tho*_*ler 7

是的,文档是错误的(至少对于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
Run Code Online (Sandbox Code Playgroud)

因此,正如我们从WinDbg的输出中看到的那样,扩展的符号路径(实际上将使用它)包含cache*指示将缓存符号的符号路径.

您在WinDbg文档中找到了这个,这可能不是定义行为的正确位置,因为WinDbg不会加载符号本身.相反,它使用dbghelp.dll,并且该DLL的行为可能会更改,而无需更新WinDbg帮助.


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

流程或多或少:

  1. 将符号路径拆分为";" 到数组元素.
  2. 对于元素中的每个元素:
    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那样的哈希等.)