目录

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 中的一部分。

  1. 首先我们假设已经移植了 CmBacktrace 库到我们工程项目上,以及在电脑上安装了 addr2line 工具软件。
  2. 假设我们的单片机发生死机并通过串口打印出由 CmBacktrace 生成错误信息。
  3. 打开命令窗口,输入由 CmBacktrace 提示的 addr2line 命令串,生成错误代码定位位置信息。
2、生成的错误信息例子:

../img/20210526_02_01.jpg

3、输入的错误定位命令:

../img/20210526_02_02.jpg

4、输出的错误位置信息:

../img/20210526_02_03.jpg

从上面的使用例子可以看出,我们很容易地使用工具为我们精准定位错误代码的位置。

移植

一、CmBacktrace 移植:

1、将追踪模块加入工程:

../img/20210526_03_01.jpg

2、初始及对接异常中断:

../img/20210526_03_03.jpg
../img/20210526_03_02.jpg
../img/20210526_03_04.jpg

3、配置和适配平台环境:

../img/20210526_03_05.jpg

4、人为地制造一个异常:

../img/20210526_03_06.jpg
出现的异常及获取异常代码位置的方法请查看上一节内容!

二、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 放到自定义路径下使用需要设置环境变量:
../img/20210526_03_07.jpg

3、CmBacktrace 模块下载:

官方介绍及下载网址:giteegithub