Crash 问题定位 -----使用addr2line命令定位到行号

这段时间经常遇到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.solibc.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









 

你可能感兴趣的:(thread,android,service,Build,Crash,Signal)