如何设置Windows符号服务器

时间:2015-03-27 20:24:35

标签: c++ visual-studio windbg debug-symbols

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

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

符号文件路径设置如下:

srv*\\192.168.1.20\symbolpath*http://msdl.microsoft.com/download/symbols

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

1 个答案:

答案 0 :(得分:14)

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

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

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

创建“符号服务器”

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

  1. 在服务器上创建一个新的空目录
  2. 如果要从其他计算机添加符号,请使用写访问权限共享文件夹。如果您从服务器本身添加符号(例如,如果服务器是构建可执行文件的持续集成服务器),则读取访问权限就足够了。
  3. 如果您想要从其他计算机添加符号,请运行symstore add /3 /f "Filename.pdb" /s "\\server\symbols" /t "Title";如果您在本地添加符号,请使用/s "C:\share\symbols"
  4. 对要添加的所有PDB文件版本重复步骤3。您还可以使用*.pdb之类的通配符。理想情况下,您将该步骤集成到构建过程中。

    在WinDbg中使用网络共享

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

    .sympath cache*C:\Symbols
    

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

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

    .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隐式使用。