这段时间经常遇到crash 的问题,这里来说说怎么使用addr2line 命令来定位问题。
1. 获取tombstone log
当系统出现crash的时候,我们可以从/data/tombstones/目录中取出tombstone log, 之后查看他的内容, 例如有如下log:
*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
Build fingerprint: '35Phone/msm8660_surf/msm8660_surf:4.0.4/IMM76I/eng..20120729.004704:eng/test-keys'
pid: 140, tid: 21500 >>> /system/bin/rild <<<
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000010
r0 00000000 r1 402a2b57 r2 e4d2d250 r3 00000000
r4 4054fbec r5 00000016 r6 002b3568 r7 00000078
r8 402ae84d r9 002b3568 10 00100000 fp 00000001
ip 4054fbfc sp 411f3620 lr 403978db pc 4035539a cpsr 20000030
d0 6d715f6c69726371 d1 73695f73616e5f69
d2 767265735f6e695f d3 745f666f5f656369
d4 0000000000000000 d5 0000000000000000
d6 0000000000000000 d7 0000000000000000
d8 0000000000000000 d9 0000000000000000
d10 0000000000000000 d11 0000000000000000
d12 0000000000000000 d13 0000000000000000
d14 0000000000000000 d15 0000000000000000
d16 6974636e7566203a d17 7972746e65206e6f
d18 0000000000000000 d19 0000000000000000
d20 0000000000000000 d21 0000000000000000
d22 0000000000000000 d23 0000000000000000
d24 0000000000000000 d25 0000000000000000
d26 0000000000000000 d27 0000000000000000
d28 0000000000000000 d29 0000000000000000
d30 0000000000000000 d31 0000000000000000
scr 00000010
#00 pc 000de39a /system/lib/libril-qc-qmi-1.so
#01 pc 000f12a8 /system/lib/libril-qc-qmi-1.so (qcril_qmi_nas_request_operator)
#02 pc 00032814 /system/lib/libril-qc-qmi-1.so
#03 pc 00037bc2 /system/lib/libril-qc-qmi-1.so
#04 pc 0001327c /system/lib/libc.so (__thread_entry)
#05 pc 00012dd0 /system/lib/libc.so (pthread_create)
.... .....
.... .....
从以上红色部分,我们知道需要找到对应的libril-qc-qmi-1.so ,libc.so。
2.获取对应的*.so
系统编译的时候,这些*.so被放置于“out/target/product/your_pro_name/system/lib”目录下,对应在out/target/product/your_pro_name/symbols/system/lib也有一个。这里需要分析的是“out/target/product/your_pro_name/symbols/system/lib”目录下的so,因为这个目录中带有对应的符号信息,您可以比较一下他们的大小就知道了。
3.使用addr2line 定位
在不同的android 平台上,该addr2line命令的位置和名称有些区别。例如在android 2.3 中该命令的位置和名称: prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi-addr2line, 但是在android 4.0 中则对应的位置为:prebuilt/linux-x86/toolchain/arm-linux-androideabi-4.4.x/bin/arm-linux-androideabi-addr2line
现在就以android 4.0 为例来讲述:
1)切换到android源码root 目录
例如 : android_source#
2)使用命令定位
android_source# prebuilt/linux-x86/toolchain/arm-linux-androideabi-4.4.x/bin/arm-linux-androideabi-addr2line -f -e out/target/product/msm7627a/symbols/system/lib/libril-qc-qmi-1.so000de39a000f12a8 00032814 00037bc20001327c 00012dd0注:
这里的“000de39a000f12a8 00032814 00037bc2 0001327c 00012dd0”是“红色”部分中的地址。
得到的结果如下:
qcril_qmi_nas_is_in_service_of_technology
/home/mtd/src/Qualcomm_AR1861/android/trunk/ics/vendor/qcom/proprietary/qcril/qcril_qmi/qcril_qmi_nas.c:6703
qcril_qmi_nas_request_operator
/home/mtd/src/Qualcomm_AR1861/android/trunk/ics/vendor/qcom/proprietary/qcril/qcril_qmi/qcril_qmi_nas.c:9492
qcril_dispatch_event
/home/mtd/src/Qualcomm_AR1861/android/trunk/ics/vendor/qcom/proprietary/qcril/qcril_qmi/qcril.c:3206
qmi_ril_fw_dedicated_request_exec_thread
/home/mtd/src/Qualcomm_AR1861/android/trunk/ics/vendor/qcom/proprietary/qcril/qcril_qmi/qcril.c:4137
??
??:0
??
??:0
注:
结果红色部分(xxxx.c: xxxx), 其中“:”前的部分表示“文件名”,后面部分表示出现问题的“行号”。
根据以上信息再分析源代码,找出具体的问题。
参考网址:
http://bootloader.wikidot.com/linux:android:crashlog