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

时间:2016-06-28 21:05:49

标签: c++ windbg

documentation说:

  

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

     

.sympath srv *

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

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

文档错误吗?

2 个答案:

答案 0 :(得分:6)

是的,文档错误(至少对于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,并且在没有更新WinDbg帮助的情况下,该DLL的行为可能会发生变化。

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

流程或多或少:

  1. 将符号路径拆分为";"到数组元素
  2. 对于元素中的每个元素
    1. 根据元素的开头切换:
      1. "高速缓存*&#34 ;:
        1. 确定缓存路径:
          1. 如果星号后面有一条路径使用该路径。
            否则使用默认缓存路径。
          2. 在此路径中缓存来自以下所有元素的符号。
      2. " symsrv *&#34 ;:
        1. 在" *"拆分元素进入(主要是路径)组件。
        2. 第一个组件是要使用的符号服务器DLL。
        3. 下一个组件是路径。对于每个路径
          1. 路径中查找符号。路径可以是其中之一
            • 本地目录。
            • UNC。
            • HTTP或HTTPS网址 - 必须是最后一条路径
            • 空字符串 - 表示默认符号存储。 (请参阅SymSetHomeDirectory!homedir。)
          2. 如果找到:
            1. 将符号复制到所有元素中以前的路径
            2. 完成符号搜索
      3. " SRV *&#34 ;:
        • 与" symsrv * symsrv.dll *"。
        • 相同
      4. 否则:
        1. 元素视为路径并在那里查找符号。 (没有像symsrv.dll那样的哈希等。)

答案 1 :(得分:1)

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

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