如何设置Windows符号服务器

yka*_*kay 9 c++ windbg debug-symbols visual-studio

我在网络上有一个备用服务器,我希望拥有所有构建符号.我已经知道如何在我的本地开发系统上设置符号缓存,并将我的调试器(例如Windbg)指向"符号文件路径"中的该路径.我假设我可以对网络上具有自己的符号缓存的另一个系统(例如\\ host\symbols)执行相同的操作.

我在目录上设置了服务器并启用了文件共享,因此我可以通过Windows资源管理器远程访问它.但是,当我尝试在WinDbg中指向它时,它似乎没有在那里拾取符号.

符号文件路径设置如下:

srv*\\192.168.1.20\symbolpath*http://msdl.microsoft.com/download/symbols
Run Code Online (Sandbox Code Playgroud)

好像我在服务器上没有正确配置它 - 是否有一个我可能会丢失的步骤?

Tho*_*ler 16

设置符号服务器和/或符号网络共享时,需要了解几件事.

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层符号存储.不要删除它.三层商店应该可以提高性能.

您可以将符号从0层存储放置到symstore.exeWinDbg附带的2层或3层存储中.您可以使用将2层商店转换为3层商店convertstore.exe.如果有错误,请参阅我的文章Convertstore Errors.

创建"符号服务器"

您设置的不是符号服务器,它是服务器符号存储,因为您使用(并且想要使用)网络共享,而不是HTTP Web服务器.以下是设置它的步骤:

  1. 在服务器上创建一个新的空目录
  2. 如果要从其他计算机添加符号,请共享具有写访问权限的文件夹.如果从服务器本身添加符号,则读访问权应该足够(例如,如果服务器是构建可执行文件的持续集成服务器).
  3. symstore add /3 /f "Filename.pdb" /s "\\server\symbols" /t "Title"如果要从其他计算机添加符号,则运行,或者/s "C:\share\symbols"如果在本地添加它们,则使用.

对要添加的所有PDB文件版本重复步骤3.您也可以使用通配符*.pdb.理想情况下,您将该步骤集成到构建过程中.

在WinDbg中使用网络共享

出于性能原因,开发人员希望从本地缓存您自己的符号以及Microsoft符号.因此,让我们先创建这样一个本地缓存:

.sympath cache*C:\Symbols
Run Code Online (Sandbox Code Playgroud)

我通常让缓存文件夹由NTFS压缩,因为符号压缩得很好.

接下来,让我们首先找到自己的符号,以避免往返Microsoft:

.sympath+ \\server\symbols
Run Code Online (Sandbox Code Playgroud)

最后,尝试从Microsoft下载其他所有内容:

.symfix+
Run Code Online (Sandbox Code Playgroud)

如果您对WinDbg工作区有所了解,可以将符号路径设置保存在工作区中,这样就不需要在每个调试会话中键入所有这些内容.不幸的是,如果你将它全部放在由分号分隔的一行中(我真的不明白为什么),它就不起作用了,但你.sympath现在可以输入并复制结果.它应该是

cache*c:\symbols;\\server\symbols;SRV*http://msdl.microsoft.com/download/symbols
Run Code Online (Sandbox Code Playgroud)

潜在问题

我现在无法重现这一点,但我记得有些问题.原因是:WinDbg在访问网络共享时不会要求凭据.解决方法是:如果您没有收到符号\\server\symbols,请在Windows资源管理器中打开该网络共享.资源管理器将要求提供凭据,它们将由Windows缓存,因此可由WinDbg隐式使用.