打印
[资源分享]

如何利用cm_backtrace快速定位AC78xx的hardfault

[复制链接]
747|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
#技术资源#利用cm_backTrace快速定位AC78xx的hardfault
在软件调试的过程中,经常会遇到出现hardfault的情况,出现hardfault,可能很难找出问题的原因。小编无意间发现了一个好东东,可以快速定位到hardfault的位置,在这里分享给大家,让大家调试跟轻松。

这个好东西就是cm_backTrace, cm_backTrace是开源软件,只要把cm_backTrace移植到AC781x/AC7801x上,在出现hardfault的时候,cm_backTrace就可以打印出当前出错信息,把这这信息输入到一个工具内(cm_backTrace提供的工具),就可以找到出现hradfault的位置。
cm_backTrace工具开源链接在:https://github.com/armink/CmBacktrace
当前最新版本(2021.3.8)的cm_backTrace可在这里下载: CmBacktrace-master.zip (4.92 MB)

接下来演示一下如何使用cm_backTrace.
1. 下载cm_backTrace源码。
2. 将下载源码的cm_backtrace文件夹放在要检查hardfault的工程内。
3. 将cm_backtrace文件夹下的源码添加至工程内,并设置相应的文件路径。
4. 重定向hardFault_Hander 中断服务函数,keil下添加.\cm_backtrace\fault_handler\keil\cmb_fault.S。(gcc或iar可添加对应文件夹下重定向文件)
5. 包含cm_backTrace头文件(#include "cm_backtrace.h"),初始化cm_backTrace(cm_backtrace_init("CM_BackTrace demo", "HW_V1.0", "SW_V1.0");).
6. 配置cm_backTrace(cmb_cfg.h).


7. 制造hardfault.
fault_test.c内提供了两个制造hardfault的函数。在这里调用fault_test_by_unalign() 制造hardfault.

运行代码,可在串口下看到:

把堆栈信息copy出来,把CM_BackTrace demo.axf替换成我们的axf文件,运行addr2line.exe,即可找出hardfault的位置。


8.运行addr2line.exe。(演示64bit win10系统操作过程)
8.1. copy addr2line.exe工具到工程生成文件夹内,工具路径在.\CmBacktrace-master\tools\addr2line\win64内。
8.2 按住Win+R键,输出cmd, 回车进入控制台。
8.3 输入工程路径所在的盘符,如<F:>,按下回车。

8.4 cd命令打开工程输出axf 文件路径。addr2lin工具组要在此路径下运行。

8.5 在串口工具最后一行输出的堆栈信息,addr2line -e CM_BackTrace demo.axf -a -f 08002612 0800198c 0800013c 080029fc 中,将CM_BackTrace demo.axf替换成我们的axf文件,即addr2line -e cm_backTrace.axf -a -f 08002612 0800198c 0800013c 080029fc
输入到控制台。


我们看一下该行代码:


从代码上看,是因为访问了非对齐的空间,造成了hardfault.

从上述的例子中可以看出,利用cm_backTrace, 很容易定位到hardfault所在的位置,再分析一下,即可找出出错原因。
测试工程上传到这里,方便大家学习。 AC781X_BackTrace.rar (1.87 MB)

使用特权

评论回复
评论
TechHolder 2021-3-8 11:17 回复TA
好帖子,干货 

相关帖子

沙发
TechHolder| | 2021-3-8 11:17 | 只看该作者
好帖子,干货

使用特权

评论回复
板凳
别看我照片| | 2021-3-8 14:37 | 只看该作者
一般启动文件,都不敢贸然修改,楼主是牛人。

使用特权

评论回复
地板
别看我照片| | 2021-3-8 14:38 | 只看该作者
一般启动文件,都不敢贸然修改,楼主是牛人。

使用特权

评论回复
5
七颗咖啡豆| | 2021-3-9 10:18 | 只看该作者
在静态库中的能定位么

使用特权

评论回复
6
czq2317| | 2021-3-9 11:50 | 只看该作者
七颗咖啡豆 发表于 2021-3-9 10:18
在静态库中的能定位么

很棒的一个问题。试了一下,把fault_test.c 编译成fault_test.lib, 然后再调用,依然能提示错误。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

87

帖子

2

粉丝