CmBacktrace (Cortex Microcontroller Backtrace)是一款针对 ARM Cortex-M 系列 MCU 的错误代码自动追踪、定位,错误原因自动分析的开源库。主要特性如下:
支持的错误包括:
断言(assert)
故障(Hard Fault, Memory Management Fault, Bus Fault, Usage Fault, Debug Fault)
故障原因 自动诊断 :可在故障发生时,自动分析出故障的原因,定位发生故障的代码位置,而无需再手动分析繁杂的故障寄存器;
输出错误现场的 函数调用栈(需配合 addr2line 工具进行精确定位),还原发生错误时的现场信息,定位问题代码位置、逻辑更加快捷、精准。也可以在正常状态下使用该库,获取当前的函数调用栈;
支持 裸机 及以下操作系统平台:
UCOS
FreeRTOS
根据错误现场状态,输出对应的 线程栈 或 C 主栈;
故障诊断信息支持多国语言(目前:简体中文、英文);
适配 Cortex-M0/M3/M4/M7 MCU;
支持 IAR、KEIL、GCC 编译器;
入门新人 :对于从 C51 、MSP430 等简单单片机转而使用更加复杂的 ARM 新人来说,时不时出现的 "hard falut" 死机会让新人瞬间懵掉。定位错误的方法也往往是连接上仿真器,一步步 F10/F11 单步,定位到具体的错误代码,再去猜测、排除、推敲错误原因,这种过程十分痛苦。
熟练老手 :慢慢的大家知道可以通过故障寄存器信息来定位故障原因及故障代码地址,虽然这样能解决一小部分问题,但是重复的、繁琐的分析过程也会耽误很多时间。而且对于一些复杂问题,只依靠代码地址是无法解决的,必须得还原错误现场的函数调用逻辑关系。虽然连接仿真器可以查看到的函数调用栈,但故障状态下是无法显示的,所以还是得一步步 F10/F11 单步去定位错误代码的位置。另外,还有两种场景,
1、很多产品真机调试时必须断开仿真器
2、问题确实存在,但是极难被重现
所以定位这类问题就显得难上加难。
使用本库 :上述所有问题都迎刃而解,可以将错误信息输出到控制台上,还可以将错误信息使用 EasyFlash 的 Log 功能保存至 Flash 中,设备死机后重启依然能够读取上次的错误信息。CmBacktrace 输出的信息包括函数调用栈、故障诊断结果、堆栈、故障寄存器及产品固件信息,极大的提升了错误定位的效率及准确性。
俗话说,工欲善其事,必先利其器。所以有时候做事效率低的原因也许是,你会用的工具种类太少。
合作、贡献 :开源软件的发展离不开大家的支持,欢迎大家多提建议,也希望更多的人一起参与进来,共同提高 。如果觉得这个开源项目很赞,可以点击 项目主页 (Github|OSChina) 右上角的 Star ,同时把它推荐给更多有需要的朋友。
该演示分如下几个步骤:
1、制造除零异常(IAR 工程,点击查看源码)
2、查看错误诊断信息
3、查看函数调用栈基本信息
4、通过命令行工具进入项目工程存放可执行文件的路径
5、使用 addr2line 命令,查看函数调用栈详细信息,并定位错误代码
目录 | 平台 | 链接 |
---|---|---|
\demos\non_os\stm32f10x |
裸机 STM32 Cortex-M3 | 点击查看 |
\demos\os\rtthread\stm32f4xx |
RT-Thread STM32 Cortex-M4 | 点击查看 |
\demos\os\ucosii\stm32f10x |
UCOSII STM32 Cortex-M3 | 点击查看 |
\demos\os\freertos\stm32f10x |
FreeRTOS STM32 Cortex-M3 | 点击查看 |
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 说明
配置文件名: 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_TYPE | CPU平台 | M0/M3/M4/M7 |
CMB_USING_DUMP_STACK_INFO | 是否使用 Dump 堆栈的功能 | 使用则定义该宏 |
CMB_PRINT_LANGUAGE | 输出信息时的语言 | CHINESE/ENGLISH |
注意:以上部分配置的内容可以在
cmb_def.h
中选择,更多灵活的配置请阅读源码
void cm_backtrace_init(const char *firmware_name, const char *hardware_ver, const char *software_ver)
参数 | 描述 |
---|---|
firmware_name | 固件名称,需与编译器生成的固件名称对应 |
hardware_ver | 固件对应的硬件版本号 |
software_ver | 固件的软件版本号 |
注意 :以上入参将会在断言或故障时输出,主要起了追溯的作用
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]); }
void cm_backtrace_assert(uint32_t sp)
参数 | 描述 |
---|---|
sp | 断言环境时的堆栈指针 |
注意 :入参 SP 尽量在断言函数内部获取,而且尽可能靠近断言函数开始的位置。当在断言函数的子函数中(例如:在 RT-Thread 的断言钩子方法中)使用时,由于函数嵌套会存在寄存器入栈的操作,此时再获取 SP 将发生变化,就需要人为调整(加减固定的偏差值)入参值,所以作为新手 不建议在断言的子函数 中使用该函数。
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
方法。所以移植时,最简单的方式就是直接使用该汇编文件。
点击查看教程:一步开启 Keil/IAR/GCC 的 C99 支持
点击查看教程:如何使用 addr2line 工具获取函数调用栈详细信息
在使用了本库提供的 cmb_fault.s 汇编文件时,因为该汇编文件内部已经定义了 HardFault_Handler ,所以如果项目中还有其他地方定义了该函数,则会提示 HardFault_Handler 被重复定义的错误。此时有两种解决方法:
1、注释/删除其他文件中定义的 HardFault_Handler
函数,仅保留 cmb_fault.s 中的;
2、将 cmb_fault.s 移除工程,手动添加 cm_backtrace_fault
函数至现有的故障处理函数,但需要注意的是,务必 保证该函数数入参的准备性 ,否则可能会导致故障诊断功能及堆栈打印功能无法正常运行。所以如果是新手,不推荐第二种解决方法。
采用 MIT 开源协议,细节请阅读项目中的 LICENSE 文件内容。
CmBacktrace 源码地址:https://github.com/armink/CmBacktrace 0、CmBacktrace 是什么 CmBacktrace (Cortex Microcontroller Backtrace)是一款针对 ARM Cortex-M 系列 MCU 的错误代码自动追踪、定位,错误原因自动分析的开源库。主要特性如下: 支持的错误包括: 断言(assert) 故
根据项目需求,改写了eMBRegHoldingCB函数,在其中调用了easyflash的ef_get_env_blob函数,程序卡死,打印信息如下: thread pri status sp stack size max used left tick error -------- --- ------- ---------- ---------- ------ --
@2019-02-14 【小记】 CmBacktrace: ARM Cortex-M 系列 MCU 错误追踪库,用来将单片机故障状态寄存器值翻译出来输出至终端上以便排错 CmBacktrace: ARM Cortex-M 系列 MCU 错误追踪库 转载于:https://www.cnblogs.com/skullboyer/p/10373110.html
Home Assistant 自带完善的设备追踪系统,方便用户监控人员及物品的地理位置。具体实现步骤: 1. 区域 Home Assistant 使用组件 zone 定义区域。启动后将根据configuration.yaml 设置的经纬度,默认生成『家』区域 zone.home,同时在地图 map 面板上以圈的形式标出。 区域也可手动创建和修改: zone: - name: School
当你运行一个公开站点时,你应该始终关闭DEBUG 设置。这会使你的服务器运行得更快,也会防止恶意用户看到由错误页面展示的一些应用细节。 但是,运行在 DEBUG为False的情况下,你不会看到你的站点所生成的错误 -- 每个人都只能看到公开的错误页面。你需要跟踪部署的站点上的错误,所以可以配置Django来生成带有错误细节的报告。 报告邮件 服务器错误 DEBUG 为 False的时候,无论什么时
当想知道一个进程在做什么事情的时候,可以通过strace命令跟踪一个进程的所有系统调用。 1、运行 php start.php status 能看到workerman相关进程的信息 如下: Hello admin ---------------------------------------GLOBAL STATUS-----------------------------------------
我想追踪连续的高点,如这张照片所示,在熊猫的时间序列中。见下图: 熊猫怎么能做到这一点? 如果你想玩一个真实的例子,你可以下载股票的价格,说“MSFT”,然后用“close”作为例子。有多种方法可以下载股票价格,但这里有一种:
在构建我的android应用程序的过程中,我得到了以下错误: 我没有得到任何代码行,甚至是哪个文件有问题。我有一大堆杰出的改变(愚蠢的我),我不想回滚--但我完全被难倒了,如何解决什么是错误的。
页面追踪分为两部分: 时间筛选 和 页面追踪列表详情 1.时间筛选 便捷按钮有今日、昨日、前日、上周 X、近七天,并且能自定义选择时间段 2.页面追踪列表 1)通过页面本身的热区来监测页面内容的热度,点击越多的内容越亮,反之则越暗 2)可以非常快速地观察到网页中的点击分布情况 注意:该功能正在优化中,暂时不对外开放。
Akka使用 GitHub Issues作为其问题跟踪系统。 浏览 Tickets 在提交一张ticket之前,请检查现有的Akka tickets是否在早些时候报告了同样的问题。非常欢迎你在现有的ticket中发表评论,尤其是当你有可以分享的重复性测试用例的时候。 路线图 请参看Akka路线图,以找出即将发行的Akka版本中的总体主题。 创建ticket 请包括 Scala 和Akka的版本及相
在Git中‘追踪分支’是用与联系本地分支和远程分支的. 如果你在’追踪分支'(Tracking Branches)上执行推送(push)或拉取(pull)时, 它会自动推送(push)或拉取(pull)到关联的远程分支上. 如果你经常要从远程仓库里拉取(pull)分支到本地,并且不想很麻烦的使用"git pull "这种格式; 那么就应当使用‘追踪分支'(Tracking Branches). ‘