When running web tests, it is possible to use breakpad to capture stack traces on crashes while running without a debugger attached and with the sandbox enabled.
On all platforms, build the target blink_tests
.
enable_dsyms = 1
to your gn build arguments before building. This slows down linking several minutes, so don't just always set it by default.use_debug_fission = true
to your gn build arguments before building.Then, create a directory where the crash dumps will be stored:
mkdir /tmp/crashes
adb shell mkdir /data/local/tmp/crashes
mkdir %TEMP%\crashes
Breakpad can be enabled by passing --enable-crash-reporter
and --crash-dumps-dir
to content shell:
out/Debug/content_shell --enable-crash-reporter \ --crash-dumps-dir=/tmp/crashes chrome://crash
out/Debug/Content\ Shell.app/Contents/MacOS/Content\ Shell \ --enable-crash-reporter --crash-dumps-dir=/tmp/crashes chrome://crash
out\Default\content_shell.exe --enable-crash-reporter ^ --crash-dumps-dir=%TEMP%\crashes chrome://crash
build/android/adb_install_apk.py out/Default/apks/ContentShell.apk build/android/adb_content_shell_command_line --enable-crash-reporter \ --crash-dumps-dir=/data/local/tmp/crashes chrome://crash build/android/adb_run_content_shell
On Linux and Android, we first have to retrieve the crash dump. On Mac and Windows, this step can be skipped.
components/crash/content/tools/dmp2minidump.py /tmp/crashes/*.dmp /tmp/minidump
adb pull $(adb shell ls /data/local/tmp/crashes/*) /tmp/chromium-renderer-minidump.dmp components/breakpad/tools/dmp2minidump /tmp/chromium-renderer-minidump.dmp /tmp/minidump
On all platforms except for Windows, we need to convert the debug symbols to a format that breakpad can understand.
components/crash/content/tools/generate_breakpad_symbols.py \ --build-dir=out/Default --binary=out/Default/content_shell \ --symbols-dir=out/Default/content_shell.breakpad.syms --clear --jobs=16
components/crash/content/tools/generate_breakpad_symbols.py \ --build-dir=out/Default \ --binary=out/Default/Content\ Shell.app/Contents/MacOS/Content\ Shell \ --symbols-dir=out/Default/content_shell.breakpad.syms --clear --jobs=16
components/crash/content/tools/generate_breakpad_symbols.py \ --build-dir=out/Default \ --binary=out/Default/lib/libcontent_shell_content_view.so \ --symbols-dir=out/Default/content_shell.breakpad.syms --clear
Now we can generate a stack trace from the crash dump. Assuming the crash dump is in minidump.dmp:
out/Default/minidump_stackwalk minidump.dmp out/Debug/content_shell.breakpad.syms
"c:\Program Files (x86)\Windows Kits\8.0\Debuggers\x64\cdb.exe" ^ -y out\Default -c ".ecxr;k30;q" -z minidump.dmp