1

我们的产品会生成小型转储文件以防出现问题。我们运行一个符号服务器来存储和访问我们构建的调试符号,以便我们从转储文件中获得正确的堆栈跟踪。

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

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

4

1 回答 1

3

你有几个选择:

  1. 在服务器中已经存在的所有 pdb 上运行 dump_syms(这是一个将 pdb 处理为基于文本的 breakpad 的 .sym 格式的工具,带有 breakpad),然后将它们上传到您的 breakpad 服务器(有几个选项,我们使用 socorro)。您还需要在您关心的构建的所有新符号上继续运行它。

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

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

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

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

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

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

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

于 2015-08-07T17:38:37.413 回答