Linux 上的 PDB 符号服务器



如何在运行 HTTP 服务器的 Linux 计算机上设置符号服务器以用于 WinDbg 和好友?

Microsoft提供的上游符号服务器是 HTTP 服务器(例如http://msdl.microsoft.com/download/symbols),我想模仿他们的行为,并使通常的 Win32 调试器能够从我自己的符号下载符号。

如何在不模拟Windows(例如通过Wine或KVM)的情况下实现这一点?

如果还没有,您可能需要复习如何在 Windows 上创建符号存储,因为要在 Linux 上创建一个,您需要创建一个兼容的文件结构。

首先,请务必注意,通过 http 共享符号服务器一点也不特别。创建符号存储后,只需将其放在可通过 http 访问的位置即可。所以,真正重要的是symstore.exe所做的工作。

我知道您不想考虑使用仿真的想法,但是您实际上有2个选择:

  1. 使用类似 Wine 的东西直接在 Linux 机器上执行symstore.exe。(我不知道KVM在这里能有多好用。
  2. 重新创建需要使用的symstore.exe功能。

如果您不想使用其任何更高级的功能(如事务、文件链接或多个用户能够导入),重新创建symstore.exe可能非常简单。


symstore.exe功能的简化视图:

  1. 在输出子目录中创建一个子目录,其中包含导入的每个pdb的名称。
  2. pdb文件进行哈希处理,并使用哈希名称创建子文件夹。
  3. pdb复制到哈希目录,并选择性地对其进行压缩。(或者,根据标志,存储与导入pdb的位置file.ptr的文件。
  4. 在哈希目录中追加一行refs.ptr,其中包含有关导入的 PDB 的一些信息。(我不相信这个文件实际上被客户端使用,dgbhelp.dll,所以这一步可能会被省略。
  5. 更新[output directory]00Admin中的文件以支持事务等内容。(同样,这只是为了将来运行symstore.exe
  6. 触摸输出文件夹中的pingme.txt

(更多信息在这里。

这听起来并不太复杂,但毫无疑问,可能需要一些时间才能正确。首先,你可能想看看Mozilla的构建脚本,该脚本将pdb放在Windows调试器知道如何读取的结构中。有关它的更多信息,请点击此处。

您可以使用pythonsymstore包将PDB(和exe/dll)文件发布到本地symstore目录,然后您只需要使用Web服务器为该目录提供服务即可。

  • 配置一个Web服务器到服务器争用目录,比如/var/www/symbols。
  • 安装 'symstore' Python 包

每次您需要发布新的 PDB/exe/dll 文件时,请将它们放在 Web 服务器上的某个位置。然后运行 python 包提供的 'symstore' 命令,例如

symstore/var/www/symbolpdb1 pdb2 ...

这会将所有指定的文件复制到更正/var/www/symbol 的子目录,并在符号存储的元文件中创建一个事务条目。

symstore 包还提供了一个 python API,因此可以从任何 python 进程以编程方式进行发布。

Symstore 软件包安装说明如下: https://pypi.org/project/symstore/

更新:查看我的更详细答案。


假设您是所有交易品种的管理员,您可以这样做:

  1. 使用symstore.exe在计算机上创建"主"符号存储。
  2. 创建新的虚拟主机或使用现有域并创建用于存储符号的子目录。
  3. 将完整的主符号存储上传到目录

要添加新符号,请再次在 Windows 计算机上执行symstore.exe。然后再次上传所有文件。您可以跳过服务器上已存在的那些,除了pingme.txt.现有文件不应更改,否则它们的哈希也应不同,这意味着它们位于不同的子目录中。

您可能希望保护符号不被访问。WinDbg 支持.htaccess.htpasswd,至少具有基本的身份验证。我想你对此很熟悉。

相关内容

最新更新