设置符号服务器和/或符号网络共享时需要了解几件事。
WinDbg 符号加载顺序
在符号路径中从头到尾搜索符号,即在符号路径中C:\a;C:\b
,它会首先查找C:\a
然后在C:\b
。虽然这并不重要,但它对性能影响很大。如果您有自己的符号,请始终将它们放在前面,以便将 HTTP 往返保存到 Microsoft 服务器。
符号存储类型
符号存储类型分为三种:
- 本地存储(磁盘上的目录)
- 服务器存储(网络共享)
- 符号服务器/HTTP 存储(带有 HTTP URL)
符号存储层
您可以拥有三种类型的符号存储,并且不应将它们混合在一个目录中:
- 0 层或简单的 PDB 文件的平面列表,通常作为构建脚本或复制/粘贴操作的输出创建。
- 2 层:符号存储为
<filename>.pdb\<hash>\<filename>.pdb
。您可以从现有的空(0 字节)中识别出 2 层符号存储pingme.txt
文件和一个000Admin
文件夹。不要删除那些。
- 3 层:符号存储为
<fi>\<filename>\<hash>\<filename>.pdb>
。您可以从空(0 字节)中识别出 3 层符号存储index2.txt
文件。不要删除它。三层存储应该可以提高性能。
您可以使用以下命令将符号从 0 层存储放置到 2 层或 3 层存储:symstore.exe
它是WinDbg 附带的。
您可以使用以下命令将 2 层商店转换为 3 层商店:convertstore.exe
。如果出现错误,请参阅转换存储错误 https://stackoverflow.com/questions/71067861/what-do-the-various-convertstore-errors-mean.
创建“符号服务器”
您所设置的不是符号服务器,而是服务器符号存储,因为您使用(并且想要使用)网络共享,而不是 HTTP Web 服务器。以下是设置步骤:
- 在服务器上新建一个空目录
- 如果您想添加来自不同计算机的符号,请共享具有写入权限的文件夹。如果您从服务器本身添加符号(例如,如果服务器是构建可执行文件的持续集成服务器),则读取访问权限应该足够了。
- Run
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 资源管理器中打开该网络共享。 Explorer 将要求提供凭据,它们将被 Windows 缓存,从而被 WinDbg 隐式使用。