| <html><body><pre>Android ndk-stack tool |
| ---------------------- |
| |
| Introduction: |
| ------------- |
| |
| This document describes the 'ndk-stack' tool that is distributed with |
| the Android NDK, since release r6. |
| |
| Overview: |
| --------- |
| |
| 'ndk-stack' is a simple tool that allows you to filter stack traces as they |
| appear in the output of 'adb logcat' and replace any address inside a shared |
| library with the corresponding <source-file>:<line-number> values. |
| |
| In a nutshell, it will translate something like: |
| |
| I/DEBUG ( 31): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** |
| I/DEBUG ( 31): Build fingerprint: 'generic/google_sdk/generic/:2.2/FRF91/43546:eng/test-keys' |
| I/DEBUG ( 31): pid: 351, tid: 351 %gt;%gt;%gt; /data/local/ndk-tests/crasher <<< |
| I/DEBUG ( 31): signal 11 (SIGSEGV), fault addr 0d9f00d8 |
| I/DEBUG ( 31): r0 0000af88 r1 0000a008 r2 baadf00d r3 0d9f00d8 |
| I/DEBUG ( 31): r4 00000004 r5 0000a008 r6 0000af88 r7 00013c44 |
| I/DEBUG ( 31): r8 00000000 r9 00000000 10 00000000 fp 00000000 |
| I/DEBUG ( 31): ip 0000959c sp be956cc8 lr 00008403 pc 0000841e cpsr 60000030 |
| I/DEBUG ( 31): #00 pc 0000841e /data/local/ndk-tests/crasher |
| I/DEBUG ( 31): #01 pc 000083fe /data/local/ndk-tests/crasher |
| I/DEBUG ( 31): #02 pc 000083f6 /data/local/ndk-tests/crasher |
| I/DEBUG ( 31): #03 pc 000191ac /system/lib/libc.so |
| I/DEBUG ( 31): #04 pc 000083ea /data/local/ndk-tests/crasher |
| I/DEBUG ( 31): #05 pc 00008458 /data/local/ndk-tests/crasher |
| I/DEBUG ( 31): #06 pc 0000d362 /system/lib/libc.so |
| I/DEBUG ( 31): |
| |
| Into the more readable output: |
| |
| ********** Crash dump: ********** |
| Build fingerprint: 'generic/google_sdk/generic/:2.2/FRF91/43546:eng/test-keys' |
| pid: 351, tid: 351 >>> /data/local/ndk-tests/crasher <<< |
| signal 11 (SIGSEGV), fault addr 0d9f00d8 |
| Stack frame #00 pc 0000841e /data/local/ndk-tests/crasher : Routine zoo in /tmp/foo/crasher/jni/zoo.c:13 |
| Stack frame #01 pc 000083fe /data/local/ndk-tests/crasher : Routine bar in /tmp/foo/crasher/jni/bar.c:5 |
| Stack frame #02 pc 000083f6 /data/local/ndk-tests/crasher : Routine my_comparison in /tmp/foo/crasher/jni/foo.c:9 |
| Stack frame #03 pc 000191ac /system/lib/libc.so |
| Stack frame #04 pc 000083ea /data/local/ndk-tests/crasher : Routine foo in /tmp/foo/crasher/jni/foo.c:14 |
| Stack frame #05 pc 00008458 /data/local/ndk-tests/crasher : Routine main in /tmp/foo/crasher/jni/main.c:19 |
| Stack frame #06 pc 0000d362 /system/lib/libc.so |
| |
| Usage: |
| ------ |
| |
| To do this, you will first need a directory containing symbolic versions of your |
| application's shared libraries. If you use the NDK build system (i.e. ndk-build), |
| then these are always located under $PROJECT_PATH/obj/local/<ab>, where |
| <ab> stands for your device's ABI (i.e. 'armeabi' by default). |
| |
| You can feed the logcat text either as direct input to the program, e.g.: |
| |
| adb logcat | $NDK/ndk-stack -sym $PROJECT_PATH/obj/local/armeabi |
| |
| Or you can use the -dump option to specify the logcat as an input file, e.g.: |
| |
| adb logcat > /tmp/foo.txt |
| $NDK/ndk-stack -sym $PROJECT_PATH/obj/local/armeabi -dump foo.txt |
| |
| |
| ** IMPORTANT **: |
| |
| The tool looks for the initial line containing starts in the logcat output, |
| i.e. something that looks like: |
| |
| *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** |
| |
| When copy/pasting traces, don't forget this line from the traces, or |
| ndk-stack won't work correctly. |
| |
| TODO: |
| ----- |
| |
| A future version of 'ndk-stack' will try to launch 'adb logcat' and select the |
| library path automatically. For now, you'll have to do these steps manually. |
| |
| As of now, ndk-stack doesn't handle libraries that don't have debug information |
| in them. It may be useful to try to detect the nearest function entry point to |
| a given PC address (e.g. as in the libc.so example above). |
| |
| </pre></body></html> |