时根据backtrace定位问题方法.docx

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
进程异常终止时根据backtrace定位问题的方法项目中经常会遇到进程异常终止的问题,本文介绍的是根据log中打印出来的backtrace定位问题点的方法。如何获取debug信息当异常发生时,一般会有两个地方保存backtrace和stack;Logcat一般在main log里面,关键字是 “DEBUG”;文件中一般在/data/tombstones,以tombstone_XX命名的文件;一般是有如下的格式:工具及使用举例主要用于定位的工具有:addr2line和objdump;使用中有两个注意点:必须使用带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,我们最终使用的目标文件是后者。必须使用正确的工具版本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),直接定位到代码行。使用及分析过程如下:在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 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的调用者在文件reference-ril.c的requestRadioPower中,在3808行;这里调用的入参p_response不是NULL,但是其内部成员line为NULL,引起了SIGSEGV段错误。通过代码流程的排查,发现在3670行有了一次free的操作,但是没有将p_response置成NULL,形成了野指针,在3808行的时候,野指针不为NULL,作为有效入参输入,导致了上述的段错误。我们通过addr2line定位到问题出现的点,缩小代码排查范围,达到了快速定位问题的目的。该工具分析过程中,必须结合源码,才能根据代码行分析问题的原因,如果没有源码,就必须依赖下面的工具来分析了。2.2 objdump该工具是用来对目标文件实施反汇编的工具,如果是带symbol的目标文件,反汇编后可以看到部分源码,如果是不带symbol的目标文件,就只能看到汇编码。不带symbol反汇编结果带symbol反汇编结果该工具使用及分析过程如下:在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-a

文档评论(0)

xuefei111 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档