您的位置:首页 > 其它

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

2012-09-24 19:22 519 查看
这段时间经常遇到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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: