功能强大的离线 hardfault 追踪工具

鱼鹰谈单片机 2021-05-18 21:21

这个工具可以直接用在 STM32 上追踪问题,但该信息只能作为参考,还需要结合其它才能最终定位问题。RT-Thread 好像已经内置了,感兴趣的可以看看,对于不能在线调试的环境来说,是不错的选择。


CmBacktrace 详细介绍

0、CmBacktrace 是什么

CmBacktrace (Cortex Microcontroller Backtrace)是一款针对 ARM Cortex-M 系列 MCU 的错误代码自动追踪、定位,错误原因自动分析的开源库。主要特性如下:

  • 支持的错误包括:

    • 断言(assert)

    • 故障(Hard Fault, Memory Management Fault, Bus Fault, Usage Fault, Debug Fault)

  • 故障原因 自动诊断 :可在故障发生时,自动分析出故障的原因,定位发生故障的代码位置,而无需再手动分析繁杂的故障寄存器;

  • 输出错误现场的 函数调用栈(需配合 addr2line 工具进行精确定位),还原发生错误时的现场信息,定位问题代码位置、逻辑更加快捷、精准。也可以在正常状态下使用该库,获取当前的函数调用栈;

  • 支持 裸机 及以下操作系统平台:

    • RT-Thread

    • UCOS

    • FreeRTOS

  • 根据错误现场状态,输出对应的 线程栈 或 C 主栈;

  • 故障诊断信息支持多国语言(目前:简体中文、英文);

  • 适配 Cortex-M0/M3/M4/M7 MCU;

  • 支持 IAR、KEIL、GCC 编译器;

1、为什么选择 CmBacktrace

入门新人 :对于从 C51 、MSP430 等简单单片机转而使用更加复杂的 ARM 新人来说,时不时出现的 "hard falut" 死机会让新人瞬间懵掉。定位错误的方法也往往是连接上仿真器,一步步 F10/F11 单步,定位到具体的错误代码,再去猜测、排除、推敲错误原因,这种过程十分痛苦。

熟练老手 :慢慢的大家知道可以通过故障寄存器信息来定位故障原因及故障代码地址,虽然这样能解决一小部分问题,但是重复的、繁琐的分析过程也会耽误很多时间。而且对于一些复杂问题,只依靠代码地址是无法解决的,必须得还原错误现场的函数调用逻辑关系。虽然连接仿真器可以查看到的函数调用栈,但故障状态下是无法显示的,所以还是得一步步 F10/F11 单步去定位错误代码的位置。另外,还有两种场景,

  • 1、很多产品真机调试时必须断开仿真器

  • 2、问题确实存在,但是极难被重现

所以定位这类问题就显得难上加难。

使用本库 :上述所有问题都迎刃而解,可以将错误信息输出到控制台上,还可以将错误信息使用 EasyFlash 的 Log 功能保存至 Flash 中,设备死机后重启依然能够读取上次的错误信息。CmBacktrace 输出的信息包括函数调用栈、故障诊断结果、堆栈、故障寄存器及产品固件信息,极大的提升了错误定位的效率及准确性。

俗话说,工欲善其事,必先利其器。所以有时候做事效率低的原因也许是,你会用的工具种类太少。

合作、贡献 :开源软件的发展离不开大家的支持,欢迎大家多提建议,也希望更多的人一起参与进来,共同提高 。如果觉得这个开源项目很赞,可以点击 项目主页 (Github|OSChina) 右上角的 Star ,同时把它推荐给更多有需要的朋友。

2、CmBacktrace 如何使用

2.1 演示

该演示分如下几个步骤:

  • 1、制造除零异常(IAR 工程,点击查看源码)

  • 2、查看错误诊断信息

  • 3、查看函数调用栈基本信息

  • 4、通过命令行工具进入项目工程存放可执行文件的路径

  • 5、使用 addr2line 命令,查看函数调用栈详细信息,并定位错误代码

  • 下面是gif演示(播放速度比较慢):

下面是静态图:

 

2.2 Demo

目录平台链接
\demos\non_os\stm32f10x裸机 STM32 Cortex-M3点击查看
\demos\os\rtthread\stm32f4xxRT-Thread STM32 Cortex-M4点击查看
\demos\os\ucosii\stm32f10xUCOSII STM32 Cortex-M3点击查看
\demos\os\freertos\stm32f10xFreeRTOS STM32 Cortex-M3点击查看

2.3 移植说明

2.3.1 准备工作

  • 1、查看 \demos 目录下有没有合适自己的 Demo ,如有类似,则建议在其基础上修改

  • 2、明确操作系统/裸机平台及 CPU 平台

  • 3、将 \src 下的全部源文件添加至产品工程中,并保证源码目录被添加至头文件路径

  • 4、cmb_fault.s 汇编文件(点击查看)可以选择性添加至工程,添加后需要把项目原有的 HardFault_Handler 注释掉

  • 5、把 cm_backtrace_init 函数放在项目初始化地方执行

  • 6、将 cm_backtrace_assert 放在项目的断言函数中执行,具体使用方法参照下面的 API 说明

  • 7、如果第 4 步骤没有将 cmb_fault.s 汇编文件启用,则需要将 cm_backtrace_fault 放到故障处理函数(例如: HardFault_Handler )中执行,具体使用方法参照下面的 API 说明

2.3.2 配置说明

配置文件名: cmb_cfg.h ,针对不同的平台和场景,用户需要自自行手动配置,常用配置如下:

配置名称功能备注
cmb_println(...)错误及诊断信息输出必须配置
CMB_USING_BARE_METAL_PLATFORM是否使用在裸机平台使用则定义该宏
CMB_USING_OS_PLATFORM是否使用在操作系统平台操作系统与裸机必须二选一
CMB_OS_PLATFORM_TYPE操作系统平台RTT/UCOSII/UCOSIII/FREERTOS
CMB_CPU_PLATFORM_TYPECPU平台M0/M3/M4/M7
CMB_USING_DUMP_STACK_INFO是否使用 Dump 堆栈的功能使用则定义该宏
CMB_PRINT_LANGUAGE输出信息时的语言CHINESE/ENGLISH

注意:以上部分配置的内容可以在 cmb_def.h 中选择,更多灵活的配置请阅读源码

2.4 API 说明

2.4.1 库初始化

void cm_backtrace_init(const char *firmware_name, const char *hardware_ver, const char *software_ver)
参数描述
firmware_name固件名称,需与编译器生成的固件名称对应
hardware_ver固件对应的硬件版本号
software_ver固件的软件版本号

注意 :以上入参将会在断言或故障时输出,主要起了追溯的作用

2.4.2 获取函数调用栈

size_t cm_backtrace_call_stack(uint32_t *buffer, size_t size, uint32_t sp)
参数描述
buffer存储函数调用栈的缓冲区
size缓冲区大小
sp待获取的堆栈指针

示例:

/* 建立深度为 16 的函数调用栈缓冲区,深度大小不应该超过 CMB_CALL_STACK_MAX_DEPTH(默认16) */
uint32_t call_stack[16] = {0};
size_t i, depth = 0;
/* 获取当前环境下的函数调用栈,每个元素将会以 32 位地址形式存储, depth 为函数调用栈实际深度 */
depth = cm_backtrace_call_stack(call_stack, sizeof(call_stack), __get_SP());
/* 输出当前函数调用栈信息
 * 注意:查看函数名称及具体行号时,需要使用 addr2line 工具转换
 */
for (i = 0; i < depth; i++) {
    printf("%08x ", call_stack[i]);
}

2.4.3 追踪断言错误信息

void cm_backtrace_assert(uint32_t sp)
参数描述
sp断言环境时的堆栈指针

注意 :入参 SP 尽量在断言函数内部获取,而且尽可能靠近断言函数开始的位置。当在断言函数的子函数中(例如:在 RT-Thread 的断言钩子方法中)使用时,由于函数嵌套会存在寄存器入栈的操作,此时再获取 SP 将发生变化,就需要人为调整(加减固定的偏差值)入参值,所以作为新手 不建议在断言的子函数 中使用该函数。

2.4.4 追踪故障错误信息

void cm_backtrace_fault(uint32_t fault_handler_lr, uint32_t fault_handler_sp)
参数描述
fault_handler_lr故障处理函数环境下的 LR 寄存器值
fault_handler_sp故障处理函数环境下的 SP 寄存器值

该函数可以在故障处理函数(例如: HardFault_Handler)中调用。另外,库本身提供了 HardFault 处理的汇编文件(点击查看,需根据自己编译器进行选择),会在故障时自动调用 cm_backtrace_fault 方法。所以移植时,最简单的方式就是直接使用该汇编文件。

2.5 常见问题

2.5.1 编译出错,提示需要 C99 支持

点击查看教程:一步开启 Keil/IAR/GCC 的 C99 支持

2.5.2 如何查看到函数调用栈中函数的具体名称及代码行号

点击查看教程:如何使用 addr2line 工具获取函数调用栈详细信息

2.5.3 故障处理函数:HardFault_Handler 重复定义

在使用了本库提供的 cmb_fault.s 汇编文件时,因为该汇编文件内部已经定义了 HardFault_Handler ,所以如果项目中还有其他地方定义了该函数,则会提示 HardFault_Handler 被重复定义的错误。此时有两种解决方法:

  • 1、注释/删除其他文件中定义的 HardFault_Handler 函数,仅保留 cmb_fault.s 中的;

  • 2、将 cmb_fault.s 移除工程,手动添加 cm_backtrace_fault 函数至现有的故障处理函数,但需要注意的是,务必 保证该函数数入参的准备性 ,否则可能会导致故障诊断功能及堆栈打印功能无法正常运行。所以如果是新手,不推荐第二种解决方法。

2.6 许可

采用 MIT 开源协议,细节请阅读项目中的 LICENSE 文件内容。

www.lnluqu.cn
www.025invest.cn
www.wx-detian.cn
www.xintravel.cn
www.fenghuicaifu.cn
www.chinaytbzw.cn
www.sydire.cn
www.jnymkj.cn
www.metrel-china.cn
www.hongheqiche.cn
www.zazhiku.cn
www.yz-hysl.cn
www.gutiangelun.cn
www.lnjjpm.cn
www.touraround.cn
www.sunmoon88.com.cn
www.13142js.cn
www.caixiantang.com.cn
www.poponet.cn
www.zglogistics.cn
www.zgxwzk.cn
www.bjltsc.cn
www.shshunfeng.cn
www.hzwssy.com.cn
www.daoyitang.cn
www.rossicount.cn
www.bjchange.cn

鱼鹰谈单片机 面向软件开发进阶读者,分享包括但不限于 C 语言、KEIL、STM32、51 等知识!
评论
  • 根据环洋市场咨询(Global Info Research)项目团队最新调研,预计2030年全球中空长航时无人机产值达到9009百万美元,2024-2030年期间年复合增长率CAGR为8.0%。 环洋市场咨询机构出版了的【全球中空长航时无人机行业总体规模、主要厂商及IPO上市调研报告,2025-2031】研究全球中空长航时无人机总体规模,包括产量、产值、消费量、主要生产地区、主要生产商及市场份额,同时分析中空长航时无人机市场主要驱动因素、阻碍因素、市场机遇、挑战、新产品发布等。报告从中空长航时
    GIRtina 2025-01-09 10:35 99浏览
  • 在当前人工智能(AI)与物联网(IoT)的快速发展趋势下,各行各业的数字转型与自动化进程正以惊人的速度持续进行。如今企业在设计与营运技术系统时所面临的挑战不仅是技术本身,更包含硬件设施、第三方软件及配件等复杂的外部因素。然而这些系统往往讲究更精密的设计与高稳定性,哪怕是任何一个小小的问题,都可能对整体业务运作造成严重影响。 POS应用环境与客户需求以本次分享的客户个案为例,该客户是一家全球领先的信息技术服务与数字解决方案提供商,遭遇到一个由他们所开发的POS机(Point of Sal
    百佳泰测试实验室 2025-01-09 17:35 112浏览
  • Snyk 是一家为开发人员提供安全平台的公司,致力于协助他们构建安全的应用程序,并为安全团队提供应对数字世界挑战的工具。以下为 Snyk 如何通过 CircleCI 实现其“交付”使命的案例分析。一、Snyk 的挑战随着客户对安全工具需求的不断增长,Snyk 的开发团队面临多重挑战:加速交付的需求:Snyk 的核心目标是为开发者提供更快、更可靠的安全解决方案,但他们的现有 CI/CD 工具(TravisCI)运行缓慢,无法满足快速开发和部署的要求。扩展能力不足:随着团队规模和代码库的不断扩大,S
    艾体宝IT 2025-01-10 15:52 43浏览
  • 车机导航有看没有懂?智能汽车语系在地化不可轻忽!随着智能汽车市场全球化的蓬勃发展,近年来不同国家地区的「Automotive Localization」(汽车在地化)布局成为兵家必争之地,同时也是车厂在各国当地市场非常关键的营销利器。汽车在地化过程中举足轻重的「汽车语系在地化」,则是透过智能汽车产品文字与服务内容的设计订制,以对应不同国家地区用户的使用习惯偏好,除了让当地车主更能清楚理解车辆功能,也能进一步提高品牌满意度。客户问题与难处某车厂客户预计在台湾市场推出新一代车款,却由于车机导航开发人
    百佳泰测试实验室 2025-01-09 17:47 24浏览
  • 1月9日,在2025国际消费电子展览会(CES)期间,广和通发布集智能语音交互及翻译、4G/5G全球漫游、随身热点、智能娱乐、充电续航等功能于一体的AI Buddy(AI陪伴)产品及解决方案,创新AI智能终端新品类。AI Buddy是一款信用卡尺寸的掌中轻薄智能设备,为用户带来实时翻译、个性化AI语音交互助手、AI影像识别、多模型账户服务、漫游资费服务、快速入网注册等高品质体验。为丰富用户视觉、听觉的智能化体验,AI Buddy通过蓝牙、Wi-Fi可配套OWS耳机、智能眼镜、智能音箱、智能手环遥
    物吾悟小通 2025-01-09 18:21 31浏览
  • HDMI 2.2 规格将至,开启视听新境界2025年1月6日,HDMI Forum, Inc. 宣布即将发布HDMI规范2.2版本。新HDMI规范为规模庞大的 HDMI 生态系统带来更多选择,为创建、分发和体验理想的终端用户效果提供更先进的解决方案。新技术为电视、电影和游戏工作室等内容制作商在当前和未来提供更高质量的选择,同时实现多种分发平台。96Gbps的更高带宽和新一代 HDMI 固定比率速率传输(Fixed Rate Link)技术为各种设备应用提供更优质的音频和视频。终端用户显示器能以最
    百佳泰测试实验室 2025-01-09 17:33 117浏览
  • 在智能网联汽车中,各种通信技术如2G/3G/4G/5G、GNSS(全球导航卫星系统)、V2X(车联网通信)等在行业内被广泛使用。这些技术让汽车能够实现紧急呼叫、在线娱乐、导航等多种功能。EMC测试就是为了确保在复杂电磁环境下,汽车的通信系统仍然可以正常工作,保护驾乘者的安全。参考《QCT-基于LTE-V2X直连通信的车载信息交互系统技术要求及试验方法-1》标准10.5电磁兼容试验方法,下面将会从整车功能层面为大家解读V2X整车电磁兼容试验的过程。测试过程揭秘1. 设备准备为了进行电磁兼容试验,技
    北汇信息 2025-01-09 11:24 97浏览
  • 1月7日-10日,2025年国际消费电子产品展览会(CES 2025)盛大举行,广和通发布Fibocom AI Stack,赋智千行百业端侧应用。Fibocom AI Stack提供集高性能模组、AI工具链、高性能推理引擎、海量模型、支持与服务一体化的端侧AI解决方案,帮助智能设备快速实现AI能力商用。为适应不同端侧场景的应用,AI Stack具备海量端侧AI模型及行业端侧模型,基于不同等级算力的芯片平台或模组,Fibocom AI Stack可将TensorFlow、PyTorch、ONNX、
    物吾悟小通 2025-01-08 18:17 87浏览
  • 职场是人生的重要战场,既是谋生之地,也是实现个人价值的平台。然而,有些思维方式却会悄无声息地拖住你的后腿,让你原地踏步甚至退步。今天,我们就来聊聊职场中最忌讳的五种思维方式,看看自己有没有中招。1. 固步自封的思维在职场中,最可怕的事情莫过于自满于现状,拒绝学习和改变。世界在不断变化,行业的趋势、技术的革新都在要求我们与时俱进。如果你总觉得自己的方法最优,或者害怕尝试新事物,那就很容易被淘汰。与其等待机会找上门,不如主动出击,保持学习和探索的心态。加入优思学院,可以帮助你快速提升自己,与行业前沿
    优思学院 2025-01-09 15:48 102浏览
  • 在过去十年中,自动驾驶和高级驾驶辅助系统(AD/ADAS)软件与硬件的快速发展对多传感器数据采集的设计需求提出了更高的要求。然而,目前仍缺乏能够高质量集成多传感器数据采集的解决方案。康谋ADTF正是应运而生,它提供了一个广受认可和广泛引用的软件框架,包含模块化的标准化应用程序和工具,旨在为ADAS功能的开发提供一站式体验。一、ADTF的关键之处!无论是奥迪、大众、宝马还是梅赛德斯-奔驰:他们都依赖我们不断发展的ADTF来开发智能驾驶辅助解决方案,直至实现自动驾驶的目标。从新功能的最初构思到批量生
    康谋 2025-01-09 10:04 99浏览
  • 一个真正的质量工程师(QE)必须将一件产品设计的“意图”与系统的可制造性、可服务性以及资源在现实中实现设计和产品的能力结合起来。所以,可以说,这确实是一种工程学科。我们常开玩笑说,质量工程师是工程领域里的「侦探」、「警察」或「律师」,守护神是"墨菲”,信奉的哲学就是「墨菲定律」。(注:墨菲定律是一种启发性原则,常被表述为:任何可能出错的事情最终都会出错。)做质量工程师的,有时会不受欢迎,也会被忽视,甚至可能遭遇主动或被动的阻碍,而一旦出了问题,责任往往就落在质量工程师的头上。虽然质量工程师并不负
    优思学院 2025-01-09 11:48 115浏览
  • 光伏逆变器是一种高效的能量转换设备,它能够将光伏太阳能板(PV)产生的不稳定的直流电压转换成与市电频率同步的交流电。这种转换后的电能不仅可以回馈至商用输电网络,还能供独立电网系统使用。光伏逆变器在商业光伏储能电站和家庭独立储能系统等应用领域中得到了广泛的应用。光耦合器,以其高速信号传输、出色的共模抑制比以及单向信号传输和光电隔离的特性,在光伏逆变器中扮演着至关重要的角色。它确保了系统的安全隔离、干扰的有效隔离以及通信信号的精准传输。光耦合器的使用不仅提高了系统的稳定性和安全性,而且由于其低功耗的
    晶台光耦 2025-01-09 09:58 81浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦