blob: 4931300378d64b78be4c6b53c0af6e1c3824edd4 [file] [log] [blame] [view]
# How to Symbolize Dumps
Evergreen will store the minidumps (`.dmp` files) from the 2 most recent
crashes on the disk. They are stored under `kSbSystemPathCacheDirectory` in the
subdirectory `crashpad_database/`. These files can be used along with
Breakpad's tools to get a full stacktrace of the past crashes. This can help in
debugging, as these minidumps have the information for the dynamic
`libcobalt.so` module correctly mapped, which a out-of-the-box dumper could not
manage.
## Obtaining the Tools to Symbolize Minidumps
Tools for symbolizing these dumps are available through
[Breakpad](https://chromium.googlesource.com/breakpad/breakpad/). Breakpad is
an open source crash reporting library that we use to obtain symbol files
(`.sym`) from unstripped binaries, and to process the symbol files with the
minidumps to produce human-readable stacktraces.
### Building Breakpad
[Breakpad](https://chromium.googlesource.com/breakpad/breakpad/) provides
instructions for building these tools yourself. The
[Getting Started with Breakpad](https://chromium.googlesource.com/breakpad/breakpad/+/master/docs/getting_started_with_breakpad.md)
guide is a good place to start if you want to go through the docs yourself, but
below is a brief overview of how to get and build the tools.
Download depot_tools:
```
$ git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
$ export PATH=/path/to/depot_tools:$PATH
```
Get breakpad:
```
$ mkdir breakpad && cd breakpad
$ fetch breakpad
$ cd src
```
Build breakpad:
```
$ ./configure && make
```
This will build the processor (`src/processor/minidump_stackwalk`), and when
building on Linux it will also build the `dump_syms` tool
(`src/tools/linux/dump_syms/dump_syms`).
**IMPORTANT:** Once you have fetched Breakpad, you should remove the path to
depot_tools from your `$PATH` environment variable, as it can conflict with
Cobalt's depot_tools.
## Symbolizing Minidumps
Now that you have all the tools you need, we can symbolize the dumps. To be
able to symbolize Cobalt using Evergreen, you need to be get the unstripped
`libcobalt.so` binary. These will be available as assets in GitHub releases
[on Cobalt's public GitHub repo](https://github.com/youtube/cobalt/releases).
libcobalt releases will be labeled by the Evergreen version, the architecture,
the config, and the ELF build id, for example
"libcobalt_1.0.10_unstripped_armeabi_softfp_qa_ac3132014007df0e.tgz". Here, we
have:
* Evergreen Version: 1.0.10
* Architecture: armeabi_softfp
* Config: qa
* ELF Build Id: ac3132014007df0e
Knowing the architecture and config you want, you'll just have to know which
version of Evergreen you're on or obtain the build id of the library. If you
need to obtain the ELF build id, you can do so easily by running
`readelf -n /path/to/libcobalt.so` and look at the hash displayed after "Build
ID:".
Now you can get the debug symbols from the library using the tools we
downloaded previously. Unpack libcobalt and dump its symbols into a file:
```
$ tar xzf /path/to/libcobalt.tgz
$ /path/to/dump_syms /path/to/unzipped/libcobalt > libcobalt.so.sym
$ head -n1 libcobalt.so.sym
MODULE Linux x86_64 6462A5D44C0843D100000000000000000 libcobalt.so
```
We run `head` on the symbol file to get the debug identifier, the hash
displayed above (in this case, it's `6462A5D44C0843D100000000000000000`). Now
we can create the file structure that `minidump_stackwalker` expects and run
the stackwalker against the minidump:
```
$ mkdir -p symbols/libcobalt.so/<debug identifier>/
$ mv libcobalt.so.sym symbols/libcobalt.so/<debug identifier>/
$ /path/to/minidump_stackwalk /path/to/your/minidump.dmp symbols/
```
`minidump_stackwalk` produces verbose output on stderr, and the stacktrace on
stdout, so you may want to redirect stderr.
### Addendum: Adding Other Symbols
We can use the process above to add symbols for any library or executable you
use, not just `libcobalt.so`. To do this, all you have to do is run the
`dump_syms` tools on the binary you want symbolized and put that in the
"symbols/" folder.
```
$ /path/to/dump_syms /path/to/<your-binary> > <your-binary>.sym
$ head -n1 <your-binary.sym>
MODULE Linux x86_64 <debug-identifier> <your-binary>
$ mkdir -p symbols/<your-binary>/<debug-identifier>
$ mv <your-binary>.sym symbols/<your-binary>/<debug-identifier>/
```
Now, `minidump_stackwalk` should symbolize sections within `<your-binary>`. For
example, if you decided to symbolize the `loader_app`, it would transform the
stacktrace output from `minidump_stackwalk` from:
```
9 loader_app + 0x3a31130
```
to:
```
9 loader_app!SbEventHandle [sandbox.cc : 44 + 0x8]
```
Note that the addresses will vary.