我尝试更多地使用windbg,但我一直遇到符号缓存问题。我不清楚字符串的格式应该是什么。
我有几个要求:
\\\foo\Build1234
c:\dev\symbols
我们在
\\\foo\Build1234
的分布式构建中的符号存档未组织为符号服务器。如果我理解正确的话,我需要使用cache关键字。
考虑到这些要求,这看起来像一个格式正确的 srvpath吗:
cache*\\foo\Build1234;srv*c:\dev\symbols*http://msdl.microsoft.com/download/symbols
编辑:
我刚刚开始阅读高级 Windows 调试,并且误解了缓存关键字的工作原理。我认为这是告诉调试器该文件夹只是文件文件夹而不是符号服务器的一种方式。迈克尔发表评论后,我重读了该部分,发现它确实按照迈克尔所描述的那样起作用。
现在,当您使用
;
或 *
来分隔路径/URL 时,我感到很困惑。当您需要 srv*
前缀时。在 Windbg 的在线帮助中,他们给出了这个例子:
\\someshare\that\cachestar\ignores;srv*c:\mysymbols*http://msdl.microsoft.com/download/symbols;cache*c:\mysymbols;\\anothershare\that\gets\cached
来自
\\\someshare
的符号不会被缓存,来自 Microsoft 的符号被缓存在 c:\mysymbols
中,并且 c:\mysymbols
用作 cache*
指令右侧任何其他路径的缓存。
偶尔使用
srv*
让我感到困惑——我不明白为什么第一个和最后一个路径没有以srv*
为前缀。
编辑2:
这对我来说慢慢开始有意义。
srv
指令用于符号服务器,而不用于普通符号目录。所以,我相信我原来问题的答案是这样的:
\\foo\Build1234;cache*c:\dev\symbols;srv*http://msdl.microsoft.com/download/symbols
SRV*C:\dev\symbols*http://msdl.microsoft.com/download/symbols;\\foo\build1234
如果
\\foo\build1234
只是扁平的 PDB,则应该可以正常工作。这里不需要缓存;您只需将该目录添加到符号路径即可。
cache 关键字指定要缓存符号文件的位置,对于从非索引共享本地缓存符号非常有用(如
\\foo\build1234
)
cache*C:\dev\symbols;SRV*C:\dev\symbols*http://msdl.microsoft.com/download/symbols;\\foo\build1234
上述路径会将来自 MS 符号服务器的符号和您的符号共享存储到本地计算机的 C:\dev\symbols 中。
要使用 Windbg 调试符号问题,请执行以下操作
!sym noisy
.reload <some exe or DLL in your session>
然后执行一些操作来强制加载 PDB。您将看到 Windbg 在哪里寻找文件,以及如果它拒绝 PDB,为什么会这样做。
!sym quiet
然后将抑制符号提示。
这里有一篇关于符号加载调试问题的详细文章。