时根据backtrace定位问题的方法

上传人:206****923 文档编号:40613541 上传时间:2018-05-26 格式:DOCX 页数:6 大小:109.24KB
返回 下载 相关 举报
时根据backtrace定位问题的方法_第1页
第1页 / 共6页
时根据backtrace定位问题的方法_第2页
第2页 / 共6页
时根据backtrace定位问题的方法_第3页
第3页 / 共6页
时根据backtrace定位问题的方法_第4页
第4页 / 共6页
时根据backtrace定位问题的方法_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《时根据backtrace定位问题的方法》由会员分享,可在线阅读,更多相关《时根据backtrace定位问题的方法(6页珍藏版)》请在金锄头文库上搜索。

1、 第 1 页进程异常终止时根据进程异常终止时根据 backtrace 定位问题的方法定位问题的方法项目中经常会遇到进程异常终止的问题,本文介绍的是根据 log 中打印出来的 backtrace 定位问题点的方法。1.如何获取如何获取 debug 信息信息当异常发生时,一般会有两个地方保存 backtrace 和 stack;(1) Logcat一般在 main log 里面,关键字是 “DEBUG”;(2) 文件中一般在/data/tombstones,以 tombstone_XX 命名的文件;一般是有如下的格式:第 2 页2.工具及使用举例工具及使用举例主要用于定位的工具有:addr2lin

2、e 和 objdump;使用中有两个注意点:(1)必须使用带 symbol 的目标文件这两个工具要结合带 symbol 的目标文件才能达到定位的目的;symbol 文件在编译过程中有,一般在最终版本中的目标文件是不带 symbol 的。以联芯的 ril 为例,其最终生成的目标文件是 out/target/product/U930HD/system/lib/libreference-ril.so 中,而其 symbol 文件在 out/target/product/U930HD/symbols/system/lib/libreference-ril.so,我们最终使用的目标文件是后者。(2)必须

3、使用正确的工具版本Android 在编译的时候,会指定 arm 的交叉编译器,我们分析问题模块时,需要使用的工具版本必须和编译过程中指定的 arm 编译器一致;以联芯为例,编译时使用的 gcc 版本是 prebuildt/linux-x86/toolchain/arm-linux-androideabi-4.4.x/bin 中指定的以 arm-linux-androideabi-xxx 命名的工具,因此我们使用的分析工具也必须是这个路径下的工具。2.1 addr2line该工具可以根据 debug 信息中提供的 address(如#00 PC xxxxxxxx),直接定位到代码行。使用及分析过

4、程如下:在 debug 信息中看到,#00 pc 0000bb96 /system/lib/libreference-ril.so#01 pc 000049e6 /system/lib/libreference-ril.so#02 pc 000070d0 /system/lib/libreference-ril.so#03 pc 000052a6 /system/lib/libril.so1. 查看第一条出错信息查看第一条出错信息: arm-linux-androideabi-addr2line f e libreference-ril.so 0000bb96 at_response_free

5、第 3 页 atchannel_mch.c: 1071这告诉我们出错的代码在文件 atchannel_mch.c 的 at_response_free 中,在 1071 行;但是 at_response_free 是 ril 的公共调用,其本身应该没有问题,问题应该在其入参,这必须知道其调用者;2. 查看第二条出错信息查看第二条出错信息: arm-linux-androideabi-addr2line f e libreference-ril.so 000049e6 requestRadioPower reference-ril.c: 3808这告诉我们之前的 at_response_free

6、 的调用者在文件 reference-ril.c 的 requestRadioPower 中,在 3808 行;这里调用的入参 p_response 不是 NULL,但是其内部成员 line 为 NULL,引起了 SIGSEGV段错误。通过代码流程的排查,第 4 页发现在 3670 行有了一次 free 的操作,但是没有将 p_response 置成 NULL,形成了野指针,在 3808 行的时候,野指针不为 NULL,作为有效入参输入,导致了上述的段错误。我们通过 addr2line 定位到问题出现的点,缩小代码排查范围,达到了快速定位问题的目的。该工具分析过程中,必须结合源码,才能根据代码

7、行分析问题的原因,如果没有源码,就必须依赖下面的工具来分析了。2.2 objdump该工具是用来对目标文件实施反汇编的工具,如果是带 symbol 的目标文件,反汇编后可以看到部分源码,如果是不带 symbol 的目标文件,就只能看到汇编码。不带 symbol 反汇编结果第 5 页带 symbol 反汇编结果该工具使用及分析过程如下:在 debug 信息中看到,#00 pc 0000bb96 /system/lib/libreference-ril.so#01 pc 000049e6 /system/lib/libreference-ril.so#02 pc 000070d0 /system/

8、lib/libreference-ril.so#03 pc 000052a6 /system/lib/libril.so1.反汇编目标文件反汇编目标文件 arm-linux-androideabi-objdump d S l libreference-ril.so libreference-ril.S这之后生成目标文件的反汇编代码文件 libreference-ril.S2.查看错误信息查看错误信息(使用带使用带 symbol 的目标文件汇编码的目标文件汇编码)在 libreference-ril.S 中查看 0000bb96 和 000049e6,第 6 页从查看的结果可以发现,问题点的代码行与 addr2line 定位出来的是一致的;在没有源码的情况下,我们只能分析到这里,知道这里的调用存在问题,可以用以指导有源码的同事做进一步的代码流程分析。3.查看错误信息查看错误信息(使用不带使用不带 symbol 的目标文件汇编码的目标文件汇编码)在 libreference-ril.S 中查看 0000bb96 和 000049e6,对于熟悉汇编码的人可以通过以上定位到问题出现地方,达到相同的分析效果。addr2line 和 objdump 的使用可以加速定位进程异常的原因,在平时的调试中作用很大。这两个命令在 linux 中也是提供了的,对于 linux 问题分析同样有效。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号