2012年3月10日星期六

Android ndk

Android ndk-stack tool----------------------Introduction:-------------This document describes the 'ndk-stack' tool that is distributed withthe Android NDK, since release r6.Overview:---------'ndk-stack' is a simple tool that allows you to filter stack traces as theyappear in the output of 'adb logcat' and replace any address inside a sharedlibrary 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.soUsage:------To do this, you will first need a directory containing symbolic versions of yourapplication'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/armeabiOr 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 thelibrary 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 informationin them. It may be useful to try to detect the nearest function entry point toa given PC address (e.g. as in the libc.so example above).

Android ndk

TAG: