文档章节

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

shzwork
 shzwork
发布于 07/30 18:02
字数 759
阅读 35
收藏 0

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

--------------------- 
作者:kuangjp 
来源:CSDN 
原文:https://blog.csdn.net/kuangjp/article/details/8013958 
版权声明:本文为博主原创文章,转载请附上博文链接!

本文转载自:https://blog.csdn.net/kuangjp/article/details/8013958

shzwork
粉丝 15
博文 817
码字总数 10675
作品 0
厦门
私信 提问
Linux 常用命令如何使用?

作者 | 守望 责编 | 郭芮 Linux常用命令中有一些命令可以在开发或调试过程中起到很好的帮助作用,有些可以帮助了解或优化我们的程序,有些可以帮我们定位疑难问题。 本文将简单介绍一下这些命...

CSDN资讯
2018/12/28
0
0
linux设备驱动第四篇:驱动调试方法

上一篇我们大概聊了如何写一个简单的字符设备驱动,我们不是神,写代码肯定会出现问题,我们需要在编写代码的过程中不断调试。在普通的c应用程序中,我们经常使用printf来输出信息,或者使用...

东辉在线
2015/04/02
3.1K
0
arm-linux-androideabi-addr2line使用

debug的时候,经常遇到类似 Fatal signal 11 (SIGSEGV) at 0x2f64699f 如果是so文件有问题,可以使用addr2line来定位,addr2lien的路径类似如下: android-sdk-windowsndk-bundletoolchainsar...

山里来的鱼
2016/09/01
274
0
linux设备驱动第四篇:以oops信息定位代码行为例谈驱动调试方法

上一篇我们大概聊了如何写一个简单的字符设备驱动,我们不是神,写代码肯定会出现问题,我们需要在编写代码的过程中不断调试。在普通的c应用程序中,我们经常使用printf来输出信息,或者使用...

HAOMCU
2015/04/02
280
0
armink/CmBacktrace

CmBacktrace: ARM Cortex-M 系列 MCU 错误追踪库 0、CmBacktrace 是什么 CmBacktrace (Cortex Microcontroller Backtrace)是一款针对 ARM Cortex-M 系列 MCU 的错误代码自动追踪、定位,错...

armink
2017/01/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

采坑指南——k8s域名解析coredns问题排查过程

正文 前几天,在ucloud上搭建的k8s集群(搭建教程后续会发出)。今天发现域名解析不了。 组件版本:k8s 1.15.0,coredns:1.3.1 过程是这样的: 首先用以下yaml文件创建了一个nginx服务 apiV...

码农实战
24分钟前
3
0
【2019年8月版本】OCP 071认证考试最新版本的考试原题-第6题

choose three Which three statements are true about indexes and their administration in an Orade database? A) An INVISIBLE index is not maintained when Data Manipulation Language......

oschina_5359
27分钟前
4
0
阿里巴巴开源 Dragonwell JDK 最新版本 8.1.1-GA 发布

导读:新版本主要有三大变化:同步了 OpenJDK 上游社区 jdk8u222-ga 的最新更新;带来了正式的 feature:G1ElasticHeap;发布了用户期待的 Windows 实验版本 Experimental Windows version。...

阿里巴巴云原生
32分钟前
3
0
教你玩转Linux—磁盘管理

Linux磁盘管理好坏直接关系到整个系统的性能问题,Linux磁盘管理常用三个命令为df、du和fdisk。 df df命令参数功能:检查文件系统的磁盘空间占用情况。可以利用该命令来获取硬盘被占用了多少...

xiangyunyan
35分钟前
6
0
js 让textarea的高度自适应父元素的高度

textarea按照普通元素设置height是没有作用的,可以这么来设置, 下面给上一段项目代码 JS代码: $.fn.extend({ txtaAutoHeight: function () { return this.each(function () {...

文文1
35分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部