在本地符号化 TreeHerder 堆栈¶
当使用 暗物质探测器 (DMD) 或 引用计数日志记录 等工具调查在 TreeHerder 上发生但无法在本地重现的问题时,您通常会遇到未符号化的堆栈。幸运的是,有一种方法可以在您自己的机器上符号化这些堆栈。
这些说明适用于 MacOS 的 Linux TreeHerder 构建,因此对于其他平台组合,可能需要进行一些修改。
从构建作业中下载 target.tar.bz2
和 target.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.py
或 fix_stacks.py
来修复堆栈。请注意,堆栈修复过程可能需要一两分钟。