【问题标题】:How to get a Windows symbol server set up如何设置 Windows 符号服务器
【发布时间】:2015-03-27 20:24:35
【问题描述】:

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

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

符号文件路径是这样设置的:

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

我似乎没有在服务器上正确配置它 -- 是否有我可能遗漏的步骤?

【问题讨论】:

  • 你的机器对 \\192.168.1.20\symbolpath 有写权限吗?
  • 我为“每个人”用户添加了读/写访问权限,但这不起作用。
  • 它是一个真正的符号服务器吗?即,您是否使用 symstore 向其推送符号?
  • 是的,到目前为止,我已经为开发版本存储了符号,并且我正在另一台机器上进行测试,如果我可以获取这些符号。
  • 所以符号被正确缓存在该共享中?在这种情况下,从windbg 尝试.sympath+ \\192\168.1.20\symbolpath。

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


【解决方案1】:

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

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 服务器。以下是设置它的步骤:

  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

我通常让缓存文件夹被 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 隐式使用。

【讨论】:

  • 比任何微软文章都好。谢谢一堆。还删除了我原来的答案以避免混淆。
  • 嗨,Thomas,如果服务器存储或符号服务器需要身份验证,那么这是他们在没有 windbg 对话框的情况下执行此操作的一种方式。
  • @Tushargarg:可能你可以使用.shell net use \\server\symbols /user:<user> <password> 之类的东西。我从未尝试过。
  • 不能设置镜像MS符号服务器的符号服务器缓存吗?
  • @EGr:您可以镜像 Microsoft 服务器,但只能镜像您目前使用的符号。这些符号必须已从 Microsoft 下载一次。您无法完全镜像它,因为您无法获得 MS 服务器上存在的所有符号的完整列表。我在去年年底 MS 符号服务器出现严重性能问题时实现了这一点。
猜你喜欢
  • 2015-03-23
  • 1970-01-01
  • 2015-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多