在设置符号服务器和/或符号网络共享时需要了解几件事。
WinDbg 符号加载顺序
在符号路径中从头到尾搜索符号,即在符号路径C:\a;C:\b中,它会先在C:\a中查找,然后在C:\b中查找。虽然这并不重要,但它对性能的影响很大。如果您有自己的符号,请始终将它们放在首位,这样您就可以将 HTTP 往返保存到 Microsoft 服务器。
符号存储类型
有三种符号存储类型:
- 本地存储(磁盘上的目录)
- 服务器存储(网络共享)
- 符号服务器/HTTP 存储(带有 HTTP URL)
符号存储层
您可以拥有三种类型的符号存储,并且不应将它们混合在一个目录中:
- 0 层或只是 PDB 文件的平面列表,通常作为构建脚本或复制/粘贴操作的输出创建。
- 2 层:符号存储为
<filename>.pdb\<hash>\<filename>.pdb。您可以从现有的空(0 字节)pingme.txt 文件和 000Admin 文件夹中识别出 2 层符号存储。不要删除那些。
- 3 层:符号存储为
<fi>\<filename>\<hash>\<filename>.pdb>。您可以从空(0 字节)index2.txt 文件中识别出 3 层符号存储。不要删除它。 3 层商店应该会提高性能。
您可以使用 WinDbg 附带的symstore.exe 将符号从 0 层存储区放入 2 层或 3 层存储区。
您可以使用convertstore.exe 将 2 层商店转换为 3 层商店。如有错误,请参阅Convertstore Errors。
创建“符号服务器”
您设置的不是符号服务器,而是服务器符号存储,因为您使用(并且想要使用)网络共享,而不是 HTTP Web 服务器。以下是设置它的步骤:
- 在服务器上新建一个空目录
- 如果您想添加来自不同机器的符号,则共享具有写入权限的文件夹。如果您从服务器本身添加符号(例如,如果服务器是构建可执行文件的持续集成服务器),则读取访问权限就足够了。
- 如果您想从其他机器添加符号,请运行
symstore add /3 /f "Filename.pdb" /s "\\server\symbols" /t "Title";如果您在本地添加符号,请使用 /s "C:\share\symbols"。
对您要添加的所有版本的 PDB 文件重复第 3 步。您还可以使用诸如*.pdb 之类的通配符。理想情况下,您将该步骤集成到您的构建过程中。
在 WinDbg 中使用网络共享
出于性能原因,开发人员希望在本地缓存您自己的网络符号以及 Microsoft 符号。因此,我们先创建这样一个本地缓存:
.sympath cache*C:\Symbols
我通常让缓存文件夹被 NTFS 压缩,因为符号压缩得很好。
接下来,让我们先找到自己的符号,以避免往返微软:
.sympath+ \\server\symbols
最后,尝试从 Microsoft 下载其他所有内容:
.symfix+
如果您对 WinDbg 工作区有所了解,您可以将符号路径设置保存在工作区中,这样您就无需在每个调试会话中输入所有这些内容。不幸的是,如果您将所有内容放在以分号分隔的一行中,则它不起作用(我真的不明白为什么),但是您现在可以输入.sympath 并复制结果。应该是
cache*c:\symbols;\\server\symbols;SRV*http://msdl.microsoft.com/download/symbols
潜在问题
我现在无法重现这个,但我记得有一些问题。原因是:WinDbg 在访问网络共享时不会要求提供凭据。解决方法是:如果您没有收到来自\\server\symbols 的符号,请在 Windows 资源管理器中打开该网络共享。资源管理器将要求提供凭据,它们将被 Windows 缓存,因此被 WinDbg 隐式使用。