关于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/
根据故障寄存器信息来定位故障原因及故障代码地址,虽然这样能解决一小部分问题,但是重复的、繁琐的分析过程也会耽误很多时间。而且对于一些复杂问题,只依靠代码地址是难以解决的,必须得还原错误现场的函数调用逻辑关系。虽然连接仿真器可以查看到的函数调用栈,但故障状态下是无法显示的
尤其是下面这种,极难复现的问题
使用CmBacktrace能够很好的应对这类场景,可以将错误信息输出到控制台上,CmBacktrace 输出的信息包括函数调用栈、故障诊断结果、堆栈、故障寄存器及产品固件信息,极大的提升了错误定位的效率及准确性。
移植过程
1.添加库文件到工程
把CmBacktrace项目文件download到本地https://github.com/armink/CmBacktrace
需要注意的是fault_handler目录下的cmb_fault.S文件需要和自己使用的平台对应
打开C99支持
配置cmb_cfg.h文件
注释之前的HardFault_Handler函数
初始化cm_backtrace
cm_backtrace_init(“KeyInterrupt”, “V1.0”, “V1.0”);
在\CmBacktrace-1.4.1\demos\non_os路径下找一个主动触发硬件错误的demo
1 | void fault_test_by_div0(void) { |
甚至能提示HardFault的原因
根据下面的提示,在MDK-ARM\Objects目录下运行:
1 | addr2line -e KeyInterrupt.axf -a -f 0800157c 080016fa |
addr2line是一个能将地址映射到源代码位置的工具(函数名 + 文件 + 行号)
-e KeyInterrupt.axf 指定带有调试信息的 ELF/AXF 文件
-a 显示地址(Address)本身
-f 显示函数名(Function)
使用 addr2line 命令,查看函数调用栈详细信息,并定位错误代码