使用 rr 调试 Firefox

此页面旨在帮助 Firefox/Gecko 开发人员开始使用 rr 调试 Firefox。

先决条件

您必须安装了 Linux 并使用最新内核。如果您尚未运行 Linux,则可以选择设置一个虚拟机来录制 Firefox。但请注意

  • rr 需要一个虚拟化 CPU 性能计数器的 VM 虚拟机管理程序。VMWare Workstation 支持该功能。

  • 在 VM 中运行会带来大约 20% 的性能损失;通常情况下,录制开销会从 ~1.2 倍增加到 ~1.4 倍。(虽然虚拟机管理程序作者能够将损失控制得如此之小,这确实是一项值得称道的成就!)

  • 某些功能(反向执行)在 VMWare 中可能无法正常工作,这是由于 VMWare 的一项优化导致的,可以通过 这种方式禁用。

当使用 VSCode 时,请考虑添加 Midas 插件以从编辑器调试 rr 跟踪。您可以使用 Midas 安装/构建 rr,并通过设置命令配置 auto-load safe path

确保您已 安装构建 rr,并且已 成功使用它。检查您是否拥有最新版本。

您可能需要为 rr/gdb 配置 auto-load safe path 以使其正常工作。如果您在 Linux 上并且您的构建位于 ~/moz 中,则将以下内容添加到 ~/.gdbinit

add-auto-load-safe-path ~/moz

强烈建议 Firefox 开发人员从源代码构建 rr。如果您的 Firefox 补丁触发了 rr 中的错误,rr 开发人员将优先修复该错误。您可能能够在几小时或几天内获得修复,而不是等待下一个版本。

录制 Firefox

要录制正常运行的 Firefox,只需在 rr 下启动它,就像在 valgrind 或 gdb 下启动它一样

$ rr $ff-objdir/dist/bin/firefox ...

或使用 mach

$ ./mach run --debugger=rr

这会将跟踪保存到您的工作目录中,如 使用说明中所述。请参阅 这些说明,了解有关如何调试录制的详细信息,本文档中未对此进行介绍。

沙盒会降低录制性能,因为存在 SIGSYS 信号和额外的系统调用。禁用它可以有所帮助。

后台挂起监视器也可能导致情况恶化,因为它会导致大量额外的系统调用。可以通过设置 toolkit.content-background-hang-monitor.disabled=true 来禁用它。

SIGSYS

在录制和回放使用 Linux 沙盒运行的 Firefox 时,您将频繁收到 SIGSYS 信号。这是由沙盒引起的预期行为。在 gdb 中,使用 handle SIGSYS noprint nostop 来抑制这些信号。

录制测试套件

您可以使用测试运行程序的 –debugger 功能将 rr 穿透 python 脚本层,到达 Firefox 启动的位置。这与您使用 –debugger 运行 valgrind 或 gdb 的方式相同,例如

$ ./mach mochitest --debugger=rr ...

测试工具在传递 –debugger 参数时会禁用慢脚本超时。这通常是合理的,因为您不希望在 Firefox 在 gdb 中停止时生成这些警告。但是,这已被 观察到会改变 Gecko 的行为。rr 不需要禁用慢脚本超时,因此为了避免此类陷阱,请将 –slowscript 参数传递给测试工具。

要在混乱模式下运行 rr

$ ./mach mochitest --debugger=rr --debugger-args="record --chaos"

您也可以在 rr 中运行整个测试工具

$ rr ./mach mochitest ...

跟踪将包含许多进程,因此要调试正确的进程,您需要使用 rr ps 或 rr replay -p firefox 等。

处理多个进程

rr 应该可以与多进程 Firefox 开箱即用。获得录制后,您可以使用 rr ps 显示所有已录制的进程,并使用 rr replay -p <pid> 附加到特定进程。

如果您想调试代码的特定部分,可以使用 MOZ_DBG 宏和 getpid() 函数将进程 ID 写入 stderr。默认情况下,MOZ_LOG 将在日志消息中包含 pid。

您可以将此与 -M 和 -g 标志结合使用,以跳转到特定进程生命周期中的特定点。

Pernosco

Pernosco 是一项商业服务,用于提供 rr 跟踪的“全知”调试。如果您有想要调试的跟踪,请参阅 使用 Pernosco 调试 Firefox

获取帮助!

如果您遇到 rr 问题,请 提交问题。Firefox 错误是高优先级,因此通常可以很快修复您的问题。

如果您想与 rr 开发人员聊天,因为您需要更多帮助或想贡献或想抱怨,我们会在 #rr 频道中闲逛。还有一个 #midas 频道。

您也可能会发现 这些调试技巧 有帮助,尽管许多技巧是针对 rr 开发人员而不是用户的。

祝您调试愉快!