class="hide-preCode-box">

定位流程

异常接管一般的定位步骤如下:

  1. 确认编译时关掉优化选项,否则下述的描述内容可能被优化掉。

  2. 打开编译后生成的镜像反汇编(asm)文件。如果默认没有生成,可以使用objdump工具生成,命令为:

    arm-none-eabi-objdump -S -l XXX.elf
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
  1. 搜索PC指针(指向当前正在执行的指令)在asm中的位置,找到发生异常的函数。

PC地址指向发生异常时程序正在执行的指令。在当前执行的二进制文件对应的asm文件中,查找PC值0x2101c61a,找到当前CPU正在执行的指令行,反汇编如下所示:

    2101c60c :
    2101c60c:	b580      	push	{r7, lr}
    2101c60e:	b084      	sub	sp, #16
    2101c610:	af00      	add	r7, sp, #0
    2101c612:	4603      	mov	r3, r0
    2101c614:	80fb      	strh	r3, [r7, #6]
    2101c616:	f04f 33ff 	mov.w	r3, #4294967295	; 0xffffffff
    2101c61a:	681b      	ldr	r3, [r3, #0]
    2101c61c:	60fb      	str	r3, [r7, #12]
    2101c61e:	68f9      	ldr	r1, [r7, #12]
    2101c620:	4803      	ldr	r0, [pc, #12]	; (2101c630 )
    2101c622:	f001 f92b 	bl	2101d87c 
    2101c626:	68fb      	ldr	r3, [r7, #12]
    2101c628:	4618      	mov	r0, r3
    2101c62a:	3710      	adds	r7, #16
    2101c62c:	46bd      	mov	sp, r7
    2101c62e:	bd80      	pop	{r7, pc}
    2101c630:	21025f90 	.word	0x21025f90
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}"> class="hide-preCode-box">
  1. 可以看到:

    1. 异常时CPU正在执行的指令是ldr r3, [r3, #0],其中r3取值为0xffffffff,导致发生非法地址异常。
    2. 异常发生在函数GetResultException0中。
  2. 根据LR值查找异常函数的父函数。

    包含LR值0x2101c64d的反汇编如下所示:

    2101c634 :
    2101c634:	b580      	push	{r7, lr}
    2101c636:	b082      	sub	sp, #8
    2101c638:	af00      	add	r7, sp, #0
    2101c63a:	4603      	mov	r3, r0
    2101c63c:	80fb      	strh	r3, [r7, #6]
    2101c63e:	4806      	ldr	r0, [pc, #24]	; (2101c658 )
    2101c640:	f001 f91c 	bl	2101d87c 
    2101c644:	88fb      	ldrh	r3, [r7, #6]
    2101c646:	4618      	mov	r0, r3
    2101c648:	f7ff ffe0 	bl	2101c60c 
    2101c64c:	4603      	mov	r3, r0
    2101c64e:	4618      	mov	r0, r3
    2101c650:	3708      	adds	r7, #8
    2101c652:	46bd      	mov	sp, r7
    2101c654:	bd80      	pop	{r7, pc}
    2101c656:	bf00      	nop
    2101c658:	21025fb0 	.word	0x21025fb0
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}"> class="hide-preCode-box">
  1. LR值2101c648上一行是bl 2101c60c ,此处调用了异常函数,调用异常函数的父函数为GetResultException1。

  2. 重复步骤3,解析异常信息中backtrace start至backtrace end之间的LR值,得到调用产生异常的函数调用栈关系,找到异常原因。

如果大家想更加深入的学习 OpenHarmony(鸿蒙南向) 开发的全栈内容,不妨可以参考以下相关学习文档进行学习,助你快速提升自己:

OpenHarmony 开发环境搭建:https://qr18.cn/CgxrRy

《OpenHarmony源码解析》:https://qr18.cn/CgxrRy

系统架构分析:https://qr18.cn/CgxrRy

OpenHarmony 设备开发学习手册:https://qr18.cn/CgxrRy

在这里插入图片描述

OpenHarmony面试题(内含参考答案):https://qr18.cn/CgxrRy

写在最后

data-report-view="{"mod":"1585297308_001","spm":"1001.2101.3001.6548","dest":"https://blog.csdn.net/maniuT/article/details/140896872","extend1":"pc","ab":"new"}">> id="blogExtensionBox" style="width:400px;margin:auto;margin-top:12px" class="blog-extension-box"> class="blog_extension blog_extension_type2" id="blog_extension"> class="extension_official" data-report-click="{"spm":"1001.2101.3001.6471"}" data-report-view="{"spm":"1001.2101.3001.6471"}"> class="blog_extension_card_left"> class="blog_extension_card_cont"> 鸿蒙开发学习资料领取!!! class="blog_extension_card_cont_r"> 微信名片
注:本文转载自blog.csdn.net的沧海一笑-dj的文章"https://blog.csdn.net/dengjin20104042056/article/details/97692710"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接

评论记录:

未查询到任何数据!