Linux Minidump to Core

On Linux, Chromium can use Breakpad to generate minidump files for crashes. It is possible to convert the minidump files to core files, and examine the core file in gdb, cgdb, or Qtcreator. In the examples below cgdb is assumed but any gdb based debugger can be used.

Contents

Creating the core file

Use minidump-2-core to convert the minidump file to a core file. On Linux, one can build the minidump-2-core target in a Chromium checkout, or alternatively, build it in a Google Breakpad checkout.

$ minidump-2-core foo.dmp > foo.core

Retrieving Chrome binaries

If the minidump is from a public build then Googlers can find Google Chrome Linux binaries and debugging symbols via https://goto.google.com/chromesymbols. Otherwise, use the locally built chrome files. Google Chrome uses the debug link method to specify the debugging file. Either way be sure to put chrome and chrome.debug (the stripped debug information) in the same directory as the core file so that the debuggers can find them.

Loading the core file into gdb/cgdb

The recommended syntax for loading a core file into gdb/cgdb is as follows, specifying both the executable and the core file:

$ cgdb chrome foo.core

If the executable is not available then the core file can be loaded on its own but debugging options will be limited:

$ cgdb -c foo.core

Loading the core file into Qtcreator

Qtcreator is a full GUI wrapper for gdb and it can also load Chrome's core files. From Qtcreator select the Debug menu, Start Debugging, Load Core File... and then enter the paths to the core file and executable. Qtcreator has windows to display the call stack, locals, registers, etc. For more information on debugging with Qtcreator see Getting Started Debugging on Linux.

Source debugging

If you have a Chromium repo that is synchronized to exactly (or even approximately) when the Chrome build was created then you can tell gdb/cgdb/Qtcreator to load source code. Since all source paths in Chrome are relative to the out/Release directory you just need to add that directory to your debugger search path, by adding a line similar to this to ~/.gdbinit:

(gdb) directory /usr/local/chromium/src/out/Release/

Notes

Since the core file is created from a minidump, it is incomplete and the debugger may not know values for variables in memory. Minidump files contain thread stacks so local variables and function parameters should be available, subject to the limitations of optimized builds.

For gdb's add-symbol-file command to work, the file must have debugging symbols.

In case of separate debug files, the gdb manual explains how gdb looks for them.

If the stack trace involve system libraries, the Advanced module loading steps shown below need to be repeated for each library.

Advanced module loading

If gdb doesn't find shared objects that are needed you can force it to load them. In gdb, the add-symbol-file command takes a filename and an address. To figure out the address, look near the end of foo.dmp, which contains a copy of /proc/pid/maps from the process that crashed.

One quick way to do this is with grep. For instance, if the executable is /path/to/chrome, one can simply run: