Skip to content

Commit

Permalink
Add container to symbolize crashpad crashes (youtube#778)
Browse files Browse the repository at this point in the history
b/266761312

(cherry picked from commit 1ebccf6)
  • Loading branch information
andrewsavage1 committed Nov 22, 2024
1 parent 87d1cd3 commit 0b58527
Show file tree
Hide file tree
Showing 3 changed files with 108 additions and 5 deletions.
15 changes: 15 additions & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,21 @@ services:
depends_on:
- base

crashpad-symbolize:
build:
args:
- GITHUB_TAG=${GITHUB_TAG:-24.lts.30}
- ARCHITECTURE=${ARCHITECTURE:-arm64}
- SB_API_VERSION=${SB_API_VERSION:-15}
- CONFIG=${CONFIG:-qa}
context: ./docker/crashpad_symbolize
dockerfile: Dockerfile
image: crashpad-symbolize
volumes:
- ${MINIDUMP_PATH:-./minidump.dmp}:/root/minidump_directory/minidump.dmp
depends_on:
- base

#### Cobalt build containers
base:
build:
Expand Down
63 changes: 63 additions & 0 deletions docker/crashpad_symbolize/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
FROM cobalt-base

RUN apt update -qqy \
&& apt install -qqy --no-install-recommends \
jq build-essential zlib1g-dev libzstd-dev \
&& /opt/clean-after-apt.sh

RUN cd /tmp \
&& git clone 'https://chromium.googlesource.com/chromium/tools/depot_tools.git'

ENV PATH=${PATH}:/tmp/depot_tools

RUN mkdir breakpad \
&& cd breakpad \
&& fetch breakpad \
&& cd src \
&& ./configure \
&& make

ARG GITHUB_TAG
RUN curl -L \
-H "Accept: application/vnd.github+json" \
-H "X-GitHub-Api-Version: 2022-11-28" \
https://api.github.com/repos/youtube/cobalt/releases/tags/${GITHUB_TAG} \
> /tmp/release.json

ARG ARCHITECTURE
ARG SB_API_VERSION
ARG CONFIG
ENV CONTAINS_STRING unstripped_${ARCHITECTURE}_sbversion-${SB_API_VERSION}_${CONFIG}
RUN jq -r --arg str "$CONTAINS_STRING" '.assets[] | select(.name | contains($str)) | .id' /tmp/release.json > /tmp/asset_ids.txt \
&& rm /tmp/release.json

RUN while read asset_id; do \
curl -LJO \
-H "Accept: application/vnd.github+json" \
-H "X-GitHub-Api-Version: 2022-11-28" \
https://api.github.com/repos/youtube/cobalt/releases/assets/${asset_id}; \
done < /tmp/asset_ids.txt

RUN id=$(cat /tmp/asset_ids.txt) && \
rm /tmp/asset_ids.txt && \
curl -s -L \
-H "Accept: application/octet-stream" \
-H "X-GitHub-Api-Version: 2022-11-28" \
https://api.github.com/repos/youtube/cobalt/releases/assets/$id -o /tmp/libcobalt.tgz

RUN mkdir /tmp/cobalt-evergreen-snapshot/ && \
tar xzf /tmp/libcobalt.tgz -C /tmp/cobalt-evergreen-snapshot

RUN breakpad/src/src/tools/linux/dump_syms/dump_syms /tmp/cobalt-evergreen-snapshot/libcobalt.so > /tmp/libcobalt.so.sym \
&& debug_id=$(head -n1 /tmp/libcobalt.so.sym | cut -d' ' -f4) \
&& mkdir -p /tmp/symbols/libcobalt.so/$debug_id/ \
&& mv /tmp/libcobalt.so.sym /tmp/symbols/libcobalt.so/$debug_id/

ENV GITHUB_TAG $GITHUB_TAG
ENV ARCHITECTURE $ARCHITECTURE
ENV SB_API_VERSION $SB_API_VERSION
ENV CONFIG $CONFIG

CMD echo "tag:${GITHUB_TAG} arch:${ARCHITECTURE} sbversion:${SB_API_VERSION} config:${CONFIG}" \
&& readelf -n /tmp/cobalt-evergreen-snapshot/libcobalt.so \
&& breakpad/src/src/processor/minidump_stackwalk /root/minidump_directory/minidump.dmp /tmp/symbols
35 changes: 30 additions & 5 deletions starboard/doc/evergreen/symbolizing_minidumps.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,41 @@ 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
## Symbolizing with the Provided Docker Container (Recommended)

We provide a docker container at `docker/crashpad_symbolize/Dockerfile` with a
corresponding docker-compose service, `crashpad-symbolize`, with which you can
symbolize your minidumps.

Build and run the container with:

```
MINIDUMP_PATH=/path/to/minidump_file.dmp docker-compose up --build crashpad-symbolize
```

Where `MINIDUMP_PATH` is the path to your minidump file. The service will also
pick up environment values for `GITHUB_TAG`, `ARCHITECTURE`, `SB_API_VERSION`,
and `CONFIG`, so ensure these are correct.

* `GITHUB_TAG`: A Cobalt version with an associated release, i.e. 25.lts.10
* `ARCHITECTURE`: One of `x64`, `x86`, `arm64`, `arm-hardfp`, or `arm-softfp`
* `SB_API_VERSION`: The Starboard version, i.e. `16`
* `CONFIG`: One of `release` or `qa`

## Symbolizing Locally

If you wish, you can download all the necessary tools to locally symbolize
minidumps. This is more work than doing it with the docker container.

### 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
#### Building Breakpad

[Breakpad](https://chromium.googlesource.com/breakpad/breakpad/) provides
instructions for building these tools yourself. The
Expand Down Expand Up @@ -51,7 +76,7 @@ building on Linux it will also build the `dump_syms` tool
depot_tools from your `$PATH` environment variable, as it can conflict with
Cobalt's depot_tools.

## Symbolizing Minidumps
### 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
Expand Down Expand Up @@ -97,7 +122,7 @@ $ /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
#### 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
Expand Down

0 comments on commit 0b58527

Please sign in to comment.