1*9712c20fSFrederick MayleGoogle Breakpad for Android 2*9712c20fSFrederick Mayle=========================== 3*9712c20fSFrederick Mayle 4*9712c20fSFrederick MayleThis document explains how to use the Google Breakpad client library 5*9712c20fSFrederick Mayleon Android, and later generate valid stack traces from the minidumps 6*9712c20fSFrederick Mayleit generates. 7*9712c20fSFrederick Mayle 8*9712c20fSFrederick MayleThis release supports ARM, x86 and MIPS based Android systems. 9*9712c20fSFrederick MayleThis release requires NDK release r11c or higher. 10*9712c20fSFrederick Mayle 11*9712c20fSFrederick MayleI. Building the client library: 12*9712c20fSFrederick Mayle=============================== 13*9712c20fSFrederick Mayle 14*9712c20fSFrederick MayleThe Android client is built as a static library that you can 15*9712c20fSFrederick Maylelink into your own Android native code. There are two ways to 16*9712c20fSFrederick Maylebuild it: 17*9712c20fSFrederick Mayle 18*9712c20fSFrederick MayleI.1. Building with ndk-build: 19*9712c20fSFrederick Mayle----------------------------- 20*9712c20fSFrederick Mayle 21*9712c20fSFrederick MayleIf you're using the ndk-build build system, you can follow 22*9712c20fSFrederick Maylethese simple steps: 23*9712c20fSFrederick Mayle 24*9712c20fSFrederick Mayle 1/ Include android/google_breakpad/Android.mk from your own 25*9712c20fSFrederick Mayle project's Android.mk 26*9712c20fSFrederick Mayle 27*9712c20fSFrederick Mayle This can be done either directly, or using ndk-build's 28*9712c20fSFrederick Mayle import-module feature. 29*9712c20fSFrederick Mayle 30*9712c20fSFrederick Mayle 2/ Link the library to one of your modules by using: 31*9712c20fSFrederick Mayle 32*9712c20fSFrederick Mayle LOCAL_STATIC_LIBRARIES += breakpad_client 33*9712c20fSFrederick Mayle 34*9712c20fSFrederick MayleNOTE: The client library requires a C++ STL implementation, 35*9712c20fSFrederick Mayle which you can select with APP_STL in your Application.mk 36*9712c20fSFrederick Mayle 37*9712c20fSFrederick Mayle It has been tested succesfully with both STLport and GNU libstdc++ 38*9712c20fSFrederick Mayle 39*9712c20fSFrederick Mayle 40*9712c20fSFrederick MayleI.2. Building with a standalone Android toolchain: 41*9712c20fSFrederick Mayle-------------------------------------------------- 42*9712c20fSFrederick Mayle 43*9712c20fSFrederick MayleAll you need to do is configure your build with the right 'host' 44*9712c20fSFrederick Maylevalue, and disable the processor and tools, as in: 45*9712c20fSFrederick Mayle 46*9712c20fSFrederick Mayle $GOOGLE_BREAKPAD_PATH/configure --host=arm-linux-androideabi \ 47*9712c20fSFrederick Mayle --disable-processor \ 48*9712c20fSFrederick Mayle --disable-tools 49*9712c20fSFrederick Mayle make -j4 50*9712c20fSFrederick Mayle 51*9712c20fSFrederick MayleThe library will be under src/client/linux/libbreakpad_client.a 52*9712c20fSFrederick Mayle 53*9712c20fSFrederick MayleYou can also use 'make check' to run the test suite on a connected 54*9712c20fSFrederick MayleAndroid device. This requires the Android 'adb' tool to be in your 55*9712c20fSFrederick Maylepath. 56*9712c20fSFrederick Mayle 57*9712c20fSFrederick MayleII. Using the client library in Android: 58*9712c20fSFrederick Mayle======================================== 59*9712c20fSFrederick Mayle 60*9712c20fSFrederick MayleThe usage instructions are very similar to the Linux ones that are 61*9712c20fSFrederick Maylefound at https://chromium.googlesource.com/breakpad/breakpad/+/master/docs/linux_starter_guide.md 62*9712c20fSFrederick Mayle 63*9712c20fSFrederick Mayle1/ You need to include "client/linux/handler/exception_handler.h" from a C++ 64*9712c20fSFrederick Mayle source file. 65*9712c20fSFrederick Mayle 66*9712c20fSFrederick Mayle2/ If you're not using ndk-build, you also need to: 67*9712c20fSFrederick Mayle 68*9712c20fSFrederick Mayle - add the following to your compiler include search paths: 69*9712c20fSFrederick Mayle $GOOGLE_BREAKPAD_PATH/src 70*9712c20fSFrederick Mayle $GOOGLE_BREAKPAD_PATH/src/common/android/include 71*9712c20fSFrederick Mayle 72*9712c20fSFrederick Mayle - add -llog to your linker flags 73*9712c20fSFrederick Mayle 74*9712c20fSFrederick Mayle Note that ndk-build does that for your automatically. 75*9712c20fSFrederick Mayle 76*9712c20fSFrederick Mayle3/ Keep in mind that there is no /tmp directory on Android. 77*9712c20fSFrederick Mayle 78*9712c20fSFrederick Mayle If you use the library from a regular Android applications, specify a 79*9712c20fSFrederick Mayle path under your app-specific storage directory. An alternative is to 80*9712c20fSFrederick Mayle store them on the SDCard, but this requires a specific permission. 81*9712c20fSFrederick Mayle 82*9712c20fSFrederick MayleFor a concrete example, see the sample test application under 83*9712c20fSFrederick Mayleandroid/sample_app. See its README for more information. 84*9712c20fSFrederick Mayle 85*9712c20fSFrederick Mayle 86*9712c20fSFrederick MayleIII. Getting a stack trace on the host: 87*9712c20fSFrederick Mayle======================================= 88*9712c20fSFrederick Mayle 89*9712c20fSFrederick MayleThis process is similar to other platforms, but here's a quick example: 90*9712c20fSFrederick Mayle 91*9712c20fSFrederick Mayle1/ Retrieve the minidumps on your development machine. 92*9712c20fSFrederick Mayle 93*9712c20fSFrederick Mayle2/ Dump the symbols for your native libraries with the 'dump_syms' tool. 94*9712c20fSFrederick Mayle This first requires building the host version of Google Breakpad, then 95*9712c20fSFrederick Mayle calling: 96*9712c20fSFrederick Mayle 97*9712c20fSFrederick Mayle dump_syms $PROJECT_PATH/obj/local/$ABI/libfoo.so > libfoo.so.sym 98*9712c20fSFrederick Mayle 99*9712c20fSFrederick Mayle3/ Create the symbol directory hierarchy. 100*9712c20fSFrederick Mayle 101*9712c20fSFrederick Mayle The first line of the generated libfoo.so.sym will have a "MODULE" 102*9712c20fSFrederick Mayle entry that carries a hexadecimal version number, e.g.: 103*9712c20fSFrederick Mayle 104*9712c20fSFrederick Mayle MODULE Linux arm D51B4A5504974FA6ECC1869CAEE3603B0 test_google_breakpad 105*9712c20fSFrederick Mayle 106*9712c20fSFrederick Mayle Note: The second field could be either 'Linux' or 'Android'. 107*9712c20fSFrederick Mayle 108*9712c20fSFrederick Mayle Extract the version number, and a 'symbol' directory, for example: 109*9712c20fSFrederick Mayle 110*9712c20fSFrederick Mayle $PROJECT_PATH/symbols/libfoo.so/$VERSION/ 111*9712c20fSFrederick Mayle 112*9712c20fSFrederick Mayle Copy/Move your libfoo.sym file there. 113*9712c20fSFrederick Mayle 114*9712c20fSFrederick Mayle4/ Invoke minidump_stackwalk to create the stack trace: 115*9712c20fSFrederick Mayle 116*9712c20fSFrederick Mayle minidump_stackwalk $MINIDUMP_FILE $PROJECT_PATH/symbols 117*9712c20fSFrederick Mayle 118*9712c20fSFrederick MayleNote that various helper scripts can be found on the web to automate these 119*9712c20fSFrederick Maylesteps. 120*9712c20fSFrederick Mayle 121*9712c20fSFrederick MayleIV. Verifying the Android build library: 122*9712c20fSFrederick Mayle======================================== 123*9712c20fSFrederick Mayle 124*9712c20fSFrederick MayleIf you modify Google Breakpad and want to check that it still works correctly 125*9712c20fSFrederick Mayleon Android, please run the android/run-checks.sh script which will do all 126*9712c20fSFrederick Maylenecessary verifications for you. This includes: 127*9712c20fSFrederick Mayle 128*9712c20fSFrederick Mayle - Rebuilding the full host binaries. 129*9712c20fSFrederick Mayle - Rebuilding the full Android binaries with configure/make. 130*9712c20fSFrederick Mayle - Rebuilding the client library unit tests, and running them on a device. 131*9712c20fSFrederick Mayle - Rebuilding the client library with ndk-build. 132*9712c20fSFrederick Mayle - Building, installing and running a test crasher program on a device. 133*9712c20fSFrederick Mayle - Extracting the corresponding minidump, dumping the test program symbols 134*9712c20fSFrederick Mayle and generating a stack trace. 135*9712c20fSFrederick Mayle - Checking the generated stack trace for valid source locations. 136*9712c20fSFrederick Mayle 137*9712c20fSFrederick MayleFor more details, please run: 138*9712c20fSFrederick Mayle 139*9712c20fSFrederick Mayle android/run-checks.sh --help-all 140