使用 LLDB 调试 Firefox

请参阅 http://lldb.llvm.org/index.html

Mozilla 特定的 lldb 设置

在 Mozilla 源码树中有一个 .lldbinit 文件,它应用推荐的设置,并通过 lldbutils 模块包含一些类型摘要和 Mozilla 特定的调试命令(请参阅 python/lldbutils/README.txt)。有关可用功能的信息,请参阅以上链接和 使用 LLDB 调试 Gecko 博客文章。

在大多数情况下,当从命令行运行 lldb(例如,使用 Mach)时,树中的 .lldbinit 应该会自动加载,但在使用 Xcode 时则**不会**。有关设置 Xcode 的信息,请参阅 在 macOS 上调试

警告

LLDB 警告:Xcode 5 仅附带 lldb(gdb 已移除)。从 2013 年 11 月左右开始,源码中引入和使用 UNIFIED_SOURCES 导致默认的 LLDB 配置出现问题,无法解析使用 UNIFIED_SOURCES 构建的文件中的断点(断点将被列为“pending”,并且 lldb 不会在这些断点处停止)。要解决此问题,请将以下内容添加到您的 $HOME/.lldbinit 文件中

# Mozilla's use of UNIFIED_SOURCES to include multiple source files into a
# single compiled file breaks lldb breakpoint setting. This works around that.
# See http://lldb.llvm.org/troubleshooting.html for more.
settings set target.inline-breakpoint-strategy always

重新启动 Xcode/lldb 并重新启动调试会话。如果这仍然无法解决问题,请尝试关闭 Xcode/lldb,执行 clobber 构建,重新打开 Xcode/lldb 并重新启动调试会话。

启动调试会话

附加到现有进程

您可以使用以下命令附加到 Firefox

(lldb) process attach --name firefox

某些版本的 lldb 在附加到 Firefox 后会导致崩溃。

运行新进程

要在调试器下启动 Firefox,请运行 lldb,后跟“–”,然后是您想要运行的命令行,如下所示

$ lldb -- obj-ff-dbg/dist/Nightly.app/Contents/MacOS/firefox -profile /path/to/profile

然后设置所需的断点并启动进程

(lldb) breakpoint set --name nsInProcessTabChildGlobal::InitTabChildGlobal
Breakpoint created: 1: name = 'nsInProcessTabChildGlobal::InitTabChildGlobal', locations = 0 (pending)
WARNING: Unable to resolve breakpoint to any actual locations.

(lldb) r
Process 7602 launched: '/.../obj-ff-opt/dist/Nightly.app/Contents/MacOS/firefox' (x86_64)
1 location added to breakpoint 1