如何从 Microsoft 符号服务器迁移到 Google Breakpad?

How can I migrate from a Microsoft Symbol Server to Google Breakpad?

我们的产品生成 minidump files in case something goes wrong. We run a symbol server 用于存储和访问我们构建的调试符号,以便我们从转储文件中获得正确的堆栈跟踪。

由于我们的产品也在其他操作系统上运行(特别是 Linux 和 OS X),我们开始研究 Google breakpad。我似乎也使用小型转储和 PDB 文件进行存储。但是,我想知道:

(如何)我可以将现有的符号服务器迁移到 Google breakpad,这样我就不会丢失所有现有的符号?我想其他人已经做了同样的举动,也许有一些共同的方法?

您有几个选择:

  1. 运行 dump_syms(这是一个把pdbs处理成text-based的工具 breakpad 的 .sym 格式,带有 breakpad)在所有已经存在的 pdb 上 服务器,然后将它们上传到您的 breakpad 服务器(有一个 几个选项,我们使用 socorro)。您还需要保持 运行ning 它在您关心的构建的所有新符号上。

  2. 从服务器请求符号,因为 stack_walker 在处理传入的崩溃时需要它们(我们还没有这样做)

  3. 定期查找上次崩溃中丢失的符号,查看它们是否在符号服务器上,运行 通过 dump_syms, 将 .syms 上传到您的崩溃服务器,然后将崩溃发送到重新处理。

您将需要访问 MS 符号服务器以获取系统符号,因此您将必须为此实现后面的选项之一。

我们为系统符号选择了选项 3,但实现在很大程度上取决于所使用的崩溃服务器(我们使用的是 socorro 崩溃统计,不是推荐的配置)。周围有多个 python MS 符号服务器集成的实现。从stack_walker你会知道符号的名称和GUID,所以你可以忽略PE解析部分。

需要注意的一个问题:OSX 上没有符号服务器的概念,而且 breakpad 崩溃转储在那里毫无用处。要从 OSX 崩溃重建堆栈跟踪,您将需要访问原始系统二进制文件(通过 dump_syms 访问 运行 它们)。这可能并不总是可能的。您将需要手动构建 OSX 符号的存储库,另请参阅:https://wiki.mozilla.org/Breakpad:Symbols

Catch #2:Windows 使用不区分大小写的 FS(令人惊讶),有时生成的 pdb 会被链接器无缘无故地小写(而使用它的 PE 二进制文件仍然引用正确的大小写)。如果您的崩溃服务器 运行ning 在 *nix 机器上,这会让人头疼。在这种情况下,考虑从 PE 二进制文件本身提取符号名称,而不是依赖 pdb 文件名。

陷阱 #3:你仍然需要 运行 你的符号服务器来调试由 breakpad 上传的转储文件(以防堆栈跟踪不够并且你想在 visual studio 中打开转储). BP 使用 符号服务器,而不是替换它。