ARM-Cortex-M 系列 MCU 错误追踪库-CmBacktrace
前言
● 对于 “hard falut” 死机,是玩 ARM Cortex-M 系列 MCU 工程师望而生畏的错误,虽然大多数情况下都是内存溢出引起,但想定位出错误代码位置,那可是一件不容易的事。
● 对于入门新人,定位错误的方法也往往是连接上仿真器,一步步 F10/F11 单步运行调试,定位到具体的错误代码,再去猜测、排除、推敲错误原因,这种过程十分痛苦。
● 对于熟练老手,知道可以通过故障寄存器信息来定位故障原因及故障代码地址,虽然这样能解决一小部分问题,但是重复的、繁琐的分析过程也会耽误很多时间。而且对于一些复杂问题,只依靠代码地址是无法解决的,必须得还原错误现场的函数调用逻辑关系。虽然连接仿真器可以查看到的函数调用栈,但故障状态下是无法显示的,所以还是得老老实实一步一步 F10/F11 单步去定位错误代码的位置。
● 工欲善其事,必先利其器。今天为大家介绍 CmBacktrace(Cortex Microcontroller Backtrace)(/‘kɔːteks /maɪkrəʊkɒnt’rəʊlə /bæk treɪs) ARM Cortex-M 系列 MCU 错误追踪库,配合 addr2line 工具,可以对故障进行精确定位。
使用
1、工具简介及异常事件:
工具 | 介绍 |
---|---|
CmBacktrace | ARM Cortex-M 系列 MCU 错误追踪库。支持断言(assert)、故障(Hard Fault, Memory Management Fault, Bus Fault, Usage Fault, Debug Fault) |
addr2line | 是一个可以将指令的地址和可执行映像转换成文件名、函数名和源代码行数的工具。它是标准的 GNU Binutils 中的一部分。 |
- 首先我们假设已经移植了 CmBacktrace 库到我们工程项目上,以及在电脑上安装了 addr2line 工具软件。
- 假设我们的单片机发生死机并通过串口打印出由 CmBacktrace 生成错误信息。
- 打开命令窗口,输入由 CmBacktrace 提示的 addr2line 命令串,生成错误代码定位位置信息。
2、生成的错误信息例子:
3、输入的错误定位命令:
4、输出的错误位置信息:
从上面的使用例子可以看出,我们很容易地使用工具为我们精准定位错误代码的位置。
移植
一、CmBacktrace 移植:
1、将追踪模块加入工程:
2、初始及对接异常中断:
3、配置和适配平台环境:
4、人为地制造一个异常:
出现的异常及获取异常代码位置的方法请查看上一节内容!
二、addr2line 移植:
1、addr2line 分析工具简介:
Linux 系统一般会集成这个工具(它是标准的 GNU Binutils 中的一部分),而 Windows 系统需要我们自己下载添加。Windows 系统下我们可以从 CmBacktrace 项目的 tools 文件夹中获取 addr2line.exe,也可以安装 MinGW 在其安装目录的 bin 文件夹里获取 addr2line.exe。将其直接拷贝至 C:\Windows 下使用或自定义路径下使用。关于 MinGW 的相关知识,请移步《MinGW-w64 编译套件(GNU 工具集)》
2、Windows 环境变量添加:
当 addr2line.exe 放到自定义路径下使用需要设置环境变量: