Debugging Firefox with LLDB

See http://lldb.llvm.org/index.html.

Mozilla-specific lldb settings

There’s an .lldbinit file in the Mozilla source tree, which applies recommended settings and includes a few type summaries and Mozilla-specific debugging commands via the lldbutils module (see python/lldbutils/README.txt). For information about available features see the links above and the Using LLDB to debug Gecko blog post.

The in-tree .lldbinit should be loaded automatically in most cases when running lldb from the command line (e.g. using Mach), but not when using Xcode. See Debugging On macOS for information on setting up Xcode.

Warning

LLDB warning: Xcode 5 only comes with lldb (gdb is gone). The introduction and use of UNIFIED_SOURCES in the source starting around November 2013 has broken the default LLDB configuration so that it will not manage to resolve breakpoints in files that are build using UNIFIED_SOURCES (the breakpoints will be listed as “pending”, and lldb will not stop at them). To fix this add the following to your $HOME/.lldbinit file:

# 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

Restart Xcode/lldb and restart your debugging session. If that still doesn’t fix things then try closing Xcode/lldb, doing a clobber build, reopening Xcode/lldb, and restarting your debugging session.

Starting a debugging session

Attaching to an existing process

You can attach to Firefox with following command:

(lldb) process attach --name firefox

Some versions of lldb causes crashes after attaching to Firefox.

Running a new process

To start Firefox under the debugger, run lldb followed by “–“, followed by the command line you’d like to run, like this:

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

Then set breakpoints you need and start the process:

(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