在本地符号化 TreeHerder 堆栈

当使用 暗物质探测器 (DMD)引用计数日志记录 等工具调查在 TreeHerder 上发生但无法在本地重现的问题时,您通常会遇到未符号化的堆栈。幸运的是,有一种方法可以在您自己的机器上符号化这些堆栈。

这些说明适用于 MacOS 的 Linux TreeHerder 构建,因此对于其他平台组合,可能需要进行一些修改。

从构建作业中下载 target.tar.bz2target.crashreporter-symbols.zip。**请注意,这些文件非常大,因此在完成操作后,您需要删除这些文件以及解压缩的文件。**

这些文件都包含大量文件,因此我建议为每个文件创建一个目录。分别将其命名为 <TARGET_DIR><SYMB_DIR>,并将前两个文件分别移动到这两个目录中。

转到 <TARGET_DIR> 并运行类似以下内容的命令:

tar xf target.tar.bz2

然后转到 <SYMB_DIR> 并运行类似以下内容的命令:

unzip target.crashreporter-symbols.zip

现在您应该可以删除这两个原始文件了。

接下来,我们需要确保二进制文件的位置从它们在 TreeHerder 上的位置重写到我们本地所在的位置。我们将通过编辑 fix_stacks.py 来执行此操作。此文件位于 Firefox 源代码目录的 tools/rb/ 目录中。您需要将这两行添加到函数 fixSymbols 中,在定义 line_str 之后并在将其写入 fix_stacks.stdin 之前。我在 is_missing_newline 的定义之前执行了此操作。

line_str = line_str.replace("/builds/worker/workspace/build/application/firefox/firefox",
                            "<TARGET_DIR>/firefox/firefox-bin")
line_str = line_str.replace("/builds/worker/workspace/build/application/firefox/libxul.so",
                            "<TARGET_DIR>/firefox/libxul.so")

初始位置应在您尝试符号化的堆栈中逐字显示,因此请仔细检查它们是否匹配。此外,当然需要将 <TARGET_DIR> 替换为这些文件实际所在的本地目录。请注意,firefox 可执行文件已更改为 firefox-bin。我不知道为什么需要这样做,但只有后者存在于我的系统中。

最后,我们需要使堆栈修复程序能够找到我们下载的 breakpad 符号的位置。如果您通过 dmd.py 或直接(在最近的版本中)运行 fix_stacks.py,则可以通过设置环境变量 BREAKPAD_SYMBOLS_PATH 为上面的 <SYMB_DIR> 来执行此操作。如果这不起作用,则需要编辑 fix_stacks.py 中的 initFixStacks,将 breakpadSymsDir 设置为 <SYMB_DIR>

完成所有这些操作后,您现在应该能够运行 dmd.pyfix_stacks.py 来修复堆栈。请注意,堆栈修复过程可能需要一两分钟。