1.addr2line
根据Android崩溃日志定位问题出处
崩溃日志一般都会有如下形式打印
I/DEBUG ( 155): backtrace:
I/DEBUG ( 155): #00 pc 00000000 <unknown>
I/DEBUG ( 155): #01 pc 002248d9 /data/data/com.x.x.x/lib/libx.so (CTest::onRequest(int, _tagASSIST_SERVER*)+16)
其实这个就是崩溃栈,通常都指明了出问题的函数,我们就可以仔细排查一下CTest::onRequest函数。
也可以通过命令 (002248d9就是libx.so中某个函数的地址)
arm-linux-androideabi-addr2line.exe -C -f -e libx.so 002248d9 来定位出问题的函数
2.NDK-STACK
ndk-stack 工具让您可以在堆叠追踪出现在 adb logcat 的输出中时过滤它们。 它还可以从源代码将共享库中的任意地址替换为对应的< source-file: < line-number> 值,从而更容易找出问题所在。
例如,它可将下面的crash log:
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): signal11(SIGSEGV), fault addr0d9f00d8I/DEBUG (31): r00000af88 r10000a008 r2 baadf00d r30d9f00d8I/DEBUG (31): r400000004r50000a008 r60000af88 r700013c44I/DEBUG (31): r800000000r9000000001000000000fp00000000I/DEBUG (31): ip0000959c sp be956cc8 lr00008403pc0000841e cpsr60000030I/DEBUG (31):#00pc0000841e /data/local/ndk-tests/crasherI/DEBUG (31):#01pc000083fe /data/local/ndk-tests/crasherI/DEBUG (31):#02pc000083f6 /data/local/ndk-tests/crasherI/DEBUG (31):#03pc000191ac /system/lib/libc.soI/DEBUG (31):#04pc000083ea /data/local/ndk-tests/crasherI/DEBUG (31):#05pc00008458/data/local/ndk-tests/crasherI/DEBUG (31):#06pc0000d362 /system/lib/libc.so
转换为带文件名、函数名和行号的log:
**********Crash dump:**********Build fingerprint:'generic/google_sdk/generic/:2.2/FRF91/43546:eng/test-keys'pid:351, tid:351>>>/data/local/ndk-tests/crasher<<<signal11(SIGSEGV), fault addr0d9f00d8Stackframe#00pc0000841e /data/local/ndk-tests/crasher : Routine zooin/tmp/foo/crasher/jni/zoo.c:13Stackframe#01pc000083fe /data/local/ndk-tests/crasher : Routine barin/tmp/foo/crasher/jni/bar.c:5Stackframe#02pc000083f6 /data/local/ndk-tests/crasher : Routine my_comparisonin/tmp/foo/crasher/jni/foo.c:9Stackframe#03pc000191ac /system/lib/libc.soStackframe#04pc000083ea /data/local/ndk-tests/crasher : Routine fooin/tmp/foo/crasher/jni/foo.c:14Stackframe#05pc00008458/data/local/ndk-tests/crasher : Routine mainin/tmp/foo/crasher/jni/main.c:19Stackframe#06pc0000d362 /system/lib/libc.so
用法
若要使用 ndk-stack,首先,需要一个包含应用共享库的符号版本。 如果使用 NDK 构建系统 (ndk-build),则这些共享库文件位于 $PROJECT_PATH/obj/local/ 下,其中 表示您的设备的 ABI。 默认情况下,系统使用 armeabi ABI。
可通过两种方式使用此工具。可以将 logcat 文本作为直接输入发送到程序。例如:
adb logcat|$NDK/ndk-stack-sym$PROJECT_PATH/obj/local/armeabi
也可以使用 -dump 选项将 logcat 指定为输入文件。例如:
adb logcat>/tmp/foo.txt$NDK/ndk-stack-sym$PROJECT_PATH/obj/local/armeabi-dumpfoo.txt
该工具在开始解析 logcat 输出时将查找第一行星号。例如:
*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
注:在复制/粘贴log时,请别忘了此行,否则 ndk-stack 无法正常工作。
系统库路径
out/target/product/ac8x_car/symbols/system/lib64/libatcmultimedia.so
在symbols中的库带有编译时的源码,需要注意的是,拷贝的so需要和问题的so为同一代码版本,否则定位出错或不准。