使用addr2line调试hardfaut_handle问题

1.简介
新手总是会遇到hardfaut的问题,比如我这样的菜鸟,总是会遇到这种问题,根据以往的调试经验,如果出现这个问题,很大部分是指针或者数组越界,现在的问题是怎么在一个工程里面找到发生越界的具体地址。遇到这样的问题,无外乎是通过uart打印log,分析log再看看问题出在哪里。这样的很大问题就是有时候log来不及打印或者不知道在什么地方打印。如果使用jlink调试,通过断点一步步逼近发生错误的地方,当然这也是个好方法,但是要定位到出错的具体位置,可能就需要addr2line,可以定位出错在哪一行。

2.使用步骤和方法
需要添加一个文件到工程中,如下

这里写图片描述

需要添加这个文件夹到工程,然后添加这个目录下面的cm_backtrace.c到工程,加入头文件,再添加fault_handler这文件下面的.s文件到工程中。需要注意的是,将工程本来的hardfaut给去除。

总的来说,
(1)添加这个文件夹的源文件和头文件保证编译能够通过
(2)添加.s文件到工程,位于fault_handler这个文件下面
(3)将本来工程里面hardfaut给去除掉
(4)将tools文件夹下面的addr2line放入到编译生成的文件里面去
(5)在mian函数初始化的地方初始化这个检测程序。初始化函数如下 cm_backtrace_init(“CmBacktrace”, “1.0”, “0.1”);

完成上面五步,就可以将编译的文件烧进板子里面
怎么使用?
(1)完成上述问题正常跑板子,然后复现log,就会在屏幕上主动打印出如下这样一句话。如下图:
这里写图片描述

如果打印出了类似的东西,就表示你的dubug成功了,前提是你能复现你出现的hardfaut。

(2)将上面的这段话其中的.out替换为自己的生成文件,这个生成文件在哪里?在上述怎么添加文件到工程的地四步里面的地方,会自己生成.out文件,然后将上图中红色线框出来的.out的前缀替换为自己的即可,如下图
这里写图片描述

上面的两个文件是不是特别的眼熟?如果按照步骤肯定会出现类似的文件。

(2)
接着在图出按住shift再右击的菜单栏单击在此处打开命令行如下这里写图片描述
在这里将上上图的红框的内容粘贴过来,记得修改红框中的内容,.如out前面的名字,改成自己的,后面的数据都是自己生成的,怎么生成?在你发送hardfaut的时候不是有吗?在仔细看看前面的笔记,上述在抓这个log的地方。

(3)回车之后的信息就能看到了,里面会记录在哪个函数发生的hardfaut和在哪一行发生的问题,是不是特别的简单?

问题:当然肯定会有小伙伴觉得,怎么在hardfaut的地方没有截图中的一大堆数据产生?这个当然是正常的,首先要检查自己的配置,修改配置的地方,就在一开始添加进工程的文件里。
这里写图片描述
打开上述文件,
这里写图片描述

主要配置上面五句话
(1)第一句,配置打log的方式,不管是rtt还是uart,将打印log的地方映射进来
(2)第二句,选择芯片中跑的系统的平台是什么样的?rtos?或者?
(3)第三句,配置芯片的内核是什么种类的m0?
(4)第四句,允许使用栈内存
(5)第五句,输出信息的语言

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值