CmBacktrace(错误追踪库)应用介绍
GaoSheng Lv4

关于HardFault调试方法可以移步至
https://dadeju.github.io/2025/04/19/HardFault%E5%B8%B8%E8%A7%81%E8%B0%83%E8%AF%95%E6%96%B9%E6%B3%95/
根据故障寄存器信息来定位故障原因及故障代码地址,虽然这样能解决一小部分问题,但是重复的、繁琐的分析过程也会耽误很多时间。而且对于一些复杂问题,只依靠代码地址是难以解决的,必须得还原错误现场的函数调用逻辑关系。虽然连接仿真器可以查看到的函数调用栈,但故障状态下是无法显示的
尤其是下面这种,极难复现的问题
图片1

使用CmBacktrace能够很好的应对这类场景,可以将错误信息输出到控制台上,CmBacktrace 输出的信息包括函数调用栈、故障诊断结果、堆栈、故障寄存器及产品固件信息,极大的提升了错误定位的效率及准确性。

移植过程

1.添加库文件到工程
把CmBacktrace项目文件download到本地https://github.com/armink/CmBacktrace
图片2

需要注意的是fault_handler目录下的cmb_fault.S文件需要和自己使用的平台对应
图片3

打开C99支持
图片4

配置cmb_cfg.h文件

图片5

注释之前的HardFault_Handler函数

图片6

初始化cm_backtrace

cm_backtrace_init(“KeyInterrupt”, “V1.0”, “V1.0”);

在\CmBacktrace-1.4.1\demos\non_os路径下找一个主动触发硬件错误的demo
图片7

1
2
3
4
5
6
7
8
9
10
11
void fault_test_by_div0(void) {
volatile int * SCB_CCR = (volatile int *) 0xE000ED14; // SCB->CCR
int x, y, z;

*SCB_CCR |= (1 << 4); /* bit4: DIV_0_TRP. */

x = 10;
y = 0;
z = x / y;
printf("z:%d\n", z);
}

甚至能提示HardFault的原因
图片8

根据下面的提示,在MDK-ARM\Objects目录下运行:

1
addr2line -e KeyInterrupt.axf -a -f 0800157c 080016fa 

addr2line是一个能将地址映射到源代码位置的工具(函数名 + 文件 + 行号)
-e KeyInterrupt.axf 指定带有调试信息的 ELF/AXF 文件
-a 显示地址(Address)本身
-f 显示函数名(Function)

使用 addr2line 命令,查看函数调用栈详细信息,并定位错误代码
图片9

本站由 提供部署服务