刷機過程當中會碰到不少crash問題,此時安卓會在/data/tombstones目錄下保存9個session文件,以下java
root@android:/ # find . |grep tombs ./data/tombstones ./data/tombstones/tombstone_00 ./data/tombstones/tombstone_01 root@android:/ #
每一個tombstone文件裏包含以下信息:linux
Build fingerprintandroid
Crashed process and PIDsshell
Terminated signal and fault addressubuntu
CPU registerssession
Call stackapp
Stack content of each call工具
下面講述怎麼使用ndk-stack和addr2line來跟蹤tombstone文件裏的錯誤信息:
ui
一、安裝NDK,設置環境變量spa
export ANDROID_NDK_PATH=/home/bytesthink/tools/android-ndk-r8d/ PATH= $ANDROID_NDK_PATH:$PATH
二、執行ndk-stack命令,其中--sym指向AOSP編譯目錄中符號路徑 --dump指向要調試的tombstone文件
bytesthink@ubuntu:~/tools/android-ndk-r8d$ ./ndk-stack -sym ~/myrelease/symbols -dump ~/win/bytesthink/Documents/test/perform_releases/tombstone_01********** Crash dump: ********** Build fingerprint: 'version1239210121' pid: 19135, tid: 19135, name: erviceinterface >>> com.test.powermeterserver.serviceinterface <<< signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr deadd00d Stack frame #00 pc 00072c9a /system/lib/libdvm.so (dvmAbort+170) Stack frame #01 pc 00050f6b /system/lib/libdvm.so (ScopedCheck::checkInstanceFieldID(_jobject*, _jfieldID*)+379) Stack frame #02 pc 0005db56 /system/lib/libdvm.so (Check_SetBooleanField(_JNIEnv*, _jobject*, _jfieldID*, unsigned char)+150) Stack frame #03 pc 00003a93 /system/lib/libmytestt.so (Java_com_test_jni_MyLibWrapper_getMonitorSample+259) Stack frame #04 pc 0002d850 /system/lib/libdvm.so (dvmPlatformInvoke+80) Stack frame #05 pc 00085b48 /system/lib/libdvm.so (dvmCallJNIMethod(unsigned int const*, JValue*, Method const*, Thread*)+648) Stack frame #06 pc 000505db /system/lib/libdvm.so (dvmCheckCallJNIMethod(unsigned int const*, JValue*, Method const*, Thread*)+59) Stack frame #07 pc 0008b96d /system/lib/libdvm.so (dvmResolveNativeMethod(unsigned int const*, JValue*, Method const*, Thread*)+317) Stack frame #08 pc 00170ff1 /system/lib/libdvm.so Stack frame #09 pc 000402a6 /system/lib/libdvm.so (dvmMterpStd(Thread*)+70) Stack frame #10 pc 0003dc14 /system/lib/libdvm.so (dvmInterpret(Thread*, Method const*, JValue*)+212) Stack frame #11 pc 000b69db /system/lib/libdvm.so (dvmInvokeMethod(Object*, Method const*, ArrayObject*, ArrayObject*, ClassObject*, bool)+2011) Stack frame #12 pc 000c9f07 /system/lib/libdvm.so (Dalvik_java_lang_reflect_Method_invokeNative(unsigned int const*, JValue*)+295) Stack frame #13 pc 00170ff1 /system/lib/libdvm.so Stack frame #14 pc 000402a6 /system/lib/libdvm.so (dvmMterpStd(Thread*)+70) Stack frame #15 pc 0003dc14 /system/lib/libdvm.so (dvmInterpret(Thread*, Method const*, JValue*)+212) Stack frame #16 pc 000b575c /system/lib/libdvm.so (dvmCallMethodV(Thread*, Method const*, Object*, bool, JValue*, char*)+700) Stack frame #17 pc 00079b8e /system/lib/libdvm.so (CallStaticVoidMethodV(_JNIEnv*, _jclass*, _jmethodID*, char*)+78) Stack frame #18 pc 0005a020 /system/lib/libdvm.so (Check_CallStaticVoidMethodV(_JNIEnv*, _jclass*, _jmethodID*, char*)+432) Stack frame #19 pc 00057c5a /system/lib/libandroid_runtime.so (_JNIEnv::CallStaticVoidMethod(_jclass*, _jmethodID*, ...)+42) Stack frame #20 pc 00059351 /system/lib/libandroid_runtime.so (android::AndroidRuntime::start(char const*, char const*)+945) Stack frame #21 pc 00000fd0 /system/bin/app_process (main+528) Stack frame #22 pc 0001a579 /system/lib/libc.so (__libc_init+89) Stack frame #00 pc 0001ca31 /system/lib/libc.so Stack frame #01 pc 000e66e8 /system/lib/libdvm.so (gcDaemonThread(void*)+216) Stack frame #02 pc 00097ee0 /system/lib/libdvm.so (internalThreadStart(void*)+528) Stack frame #03 pc 0000deb8 /system/lib/libc.so (__thread_entry+248) Stack frame #04 pc 0001c951 /system/lib/libc.so Stack frame #05 pc 000021e0 /dev/ashmem/dalvik-LinearAlloc (deleted) Stack frame #06 pc 0000af42 /data/dalvik-cache/system@app@PowerManagementService.apk@classes.dex Stack frame #00 pc 0001c05b /system/lib/libc.so Stack frame #01 pc 0009163c /system/lib/libdvm.so (signalCatcherThreadStart(void*)+92) Stack frame #02 pc 00097ee0 /system/lib/libdvm.so (internalThreadStart(void*)+528) Stack frame #03 pc 0000deb8 /system/lib/libc.so (__thread_entry+248) Stack frame #04 pc 0001c951 /system/lib/libc.so Stack frame #05 pc 00002ff4 /system/lib/libdvm.so Stack frame #00 pc 0001c317 /system/lib/libc.so Stack frame #01 pc 000c012b /system/lib/libdvm.so (jdwpThreadStart(void*)+123)
經過上圖發現libmytestt.so在PC地址 00003a93處崩潰;
三、使用addr2line調試
NDK和Linux上都帶有這個工具,路徑以下:
i686-linux-android-addr2line NDK路徑:android-ndk-r8d/toolchains/x86-4.6/prebuilt/linux-x86/bin/
能夠轉換個別名在全局環境中使用 alias addr2line='~/tools/android-ndk-r8d/toolchains/x86-4.6/prebuilt/linux-x86/bin/i686-linux-android-addr2line' 使用命令 bytesthink@ubuntu:~/tools/android-ndk-r8d$ addr2line -f -e ~/myrelease/symbols/system/lib/libmytestt.so 00003a93 Java_com_test_jni_MyLibWrapper_getMonitorSample .../device/test/PRIVATE/log_infra/myservice/jni/com_test_jni_MyLibWrapper.c:189