sunnydragon 发表于 2017-4-19 17:39:33

【开源】ARM Cortex-M 错误追踪库,让 HardFault 不再可怕

本帖最后由 sunnydragon 于 2017-4-19 19:17 编辑

CmBacktrace: ARM Cortex-M 系列 MCU 错误追踪库

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|Coding) 右上角的 Star ,同时把它推荐给更多有需要的朋友。
2、CmBacktrace 如何使用

2.1 演示该演示分如下几个步骤:
[*]1、制造除零异常(IAR 工程,点击查看源码)
[*]2、查看错误诊断信息
[*]3、查看函数调用栈基本信息
[*]4、通过命令行工具进入项目工程存放可执行文件的路径
[*]5、使用 addr2line 命令,查看函数调用栈详细信息,并定位错误代码


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点击查看


更多移植、 API 说明及常见问题说明文档,详见 :https://github.com/armink/CmBacktrace的 2.3 、 2.4 及 2.5 章节

2.3 许可

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

3、下载

最新版请关注 GitHub :https://github.com/armink/CmBacktrace
本坛:

4、其他

历经半年多的努力 CmBacktrace 终于正式与大家见面,开发在 4 个月前基本都结束了,但迟迟不敢轻易的正式发布。一方面 CmBacktrace 作为很底层的库,同时身兼故障诊断的重任,必须要充分测试,保证其可靠性,再者也想让自己的开源节奏降低些,专注用户的真实需求,培养更多的刚需用户。用户群大了,才能真正体现出开源软件的价值。

最后,要感谢我的老婆,她在家里承担了绝大多数家务以及小孩的教育,这才让我有充足的业余时间去做这些开源软件。

另外,还要感谢我身边那些愿意去试用测试,第一次吃螃蟹的开发者,是他们不停地反馈、交流,才让软件质量和用户体验得到很大的提高。



sunnydragon 发表于 2017-5-22 21:49:28

CmBacktrace V1.0.0 正式版先已发布,增加对 FreeRTOS 的支持,欢迎大家下载。

yiminglei_2 发表于 2017-4-19 17:40:29

好东西啊~

foxpro2005 发表于 2017-4-19 17:43:23

这工具不错,感谢分享

jiaowoxiaolu 发表于 2017-4-19 17:45:33

大赞!!!!

tim 发表于 2017-4-19 17:54:27

好东西! "hard falut" 让人瞬间懵逼,希望这个能很好解决!

315936392 发表于 2017-4-19 18:05:45

挺好的东西

小应电子 发表于 2017-4-19 18:27:59

好东西 大赞

talkingbeast 发表于 2017-4-19 18:35:56

   太感谢了,从楼主这里学到很多,谢谢。

FireHe 发表于 2017-4-19 18:42:28

感谢楼主

楼主的开源让我获益良多啊

每一个开源都是精品,都是戳到用户痛点的好东西。非常难得~~~

gdoujiajia 发表于 2017-4-19 18:51:53

好东西,之前碰到过HardFault,很难查原因

huchunlei 发表于 2017-4-19 18:59:35

真的是好东西,之前看到有人分析如何定位故障代码,就一直想着有没有开源的库可以用,结果真的来了, 太感谢了。    本来还以为这种除错的库会是 ARM 或者 ST 官方会出,结果想错了。

mlnet 发表于 2017-4-19 19:07:41

感谢感谢,,我想问问这个适合于我们这种小白的业余爱好者吗?

596142041 发表于 2017-4-19 19:13:06

感谢楼主的分享.

落叶知秋 发表于 2017-4-19 19:32:48

这个实在太实用了,谢谢楼主的分享

lanfeng0107 发表于 2017-4-19 19:40:14

好东西,楼主牛人

Shampoo 发表于 2017-4-19 19:41:10

楼主又出精品,正准备移植楼主Freemodbus的主机到FreeRTOS。

xiaoergao 发表于 2017-4-19 19:44:40

嗯 确实是好。但是目前跑的是自己一直的一个轻量级的os不知是否支持。回头测试下。

xuyapple 发表于 2017-4-19 19:46:47

很厉害,精品啊!

登云钓月 发表于 2017-4-19 19:58:08

厉害了 我的歌

wmm20031015 发表于 2017-4-19 20:26:00

这个比较强大,感谢楼主,下来试试{:lol:}

tianheiGE 发表于 2017-4-19 20:26:50

之前我有写过一篇有异曲同工的文章,在Linux中如何利用backtrace信息解决问题,最后我想MCU也可以这么做,感谢楼主分享出来

bad_fpga 发表于 2017-4-19 20:40:46

楼主出品,必属精品

R8C 发表于 2017-4-19 20:55:32

实在看不明白,有什么用

honami520 发表于 2017-4-19 21:00:31

楼主出品,必属精品啊。这个还是挺牛逼的。研究下,加到程序里面去。

njjh1718 发表于 2017-4-19 21:06:17

好资料 谢谢来学习一下

4058665 发表于 2017-4-19 21:11:01

楼主的帖子总是那么高上大,厉害!

SNOOKER 发表于 2017-4-19 21:18:11

这个很厉害啊,还有gCC版本

-佛听- 发表于 2017-4-19 21:18:49

厉害啊真佩服         

sblpp 发表于 2017-4-19 21:32:54

感谢楼主,感谢楼主的老婆!

cu_ice 发表于 2017-4-19 21:33:47

好东西,HardFault ,标记

chengsong 发表于 2017-4-19 21:36:25

好东西,谢谢楼主分享。

leijiayou 发表于 2017-4-19 21:45:17

感谢楼主的分享。。。。。。

wz18th 发表于 2017-4-19 21:48:07

感谢楼主分享,收藏学习了

硬邦邦 发表于 2017-4-19 21:49:25

好东西,谢谢楼主分享。

mypc16888 发表于 2017-4-19 22:04:55

好东西,感谢分享

ronic 发表于 2017-4-19 22:12:32

大赞咯,感谢分享

浮华一生 发表于 2017-4-19 22:30:59

谢谢 学习 收藏

zj2003 发表于 2017-4-19 22:36:15

流弊啊,谢谢!

机器人天空 发表于 2017-4-19 22:37:34

太赞了,满满的干货

farmerzhangdl 发表于 2017-4-19 22:48:20

不错不错

tdh03z 发表于 2017-4-19 23:15:56

非常感谢啊,回头长时间使用下

lwc86 发表于 2017-4-19 23:48:50

好东西,真心赞!!

xaper 发表于 2017-4-20 00:25:05

楼主又出好东西了,赞

neqee 发表于 2017-4-20 00:57:16

谢谢分享!收藏了

miaoguoqiang 发表于 2017-4-20 07:13:27

linux段错误如何定位

Shaopus 发表于 2017-4-20 07:37:59

大赞,感谢楼主。

yzhu 发表于 2017-4-20 08:06:34

好东西,收藏了!

altim_li 发表于 2017-4-20 08:31:36

不错,好东西,支持一下。

longjunyi 发表于 2017-4-20 08:34:30

正在为HardFault头痛呢

fengyunyu 发表于 2017-4-20 08:35:09

单纯顶一下大牛

sunnydragon 发表于 2017-4-20 08:35:57

tim 发表于 2017-4-19 17:54
好东西! "hard falut" 让人瞬间懵逼,希望这个能很好解决!

亲手试试就知道喽~~欢迎反馈体验。。

sunnydragon 发表于 2017-4-20 08:37:20

talkingbeast 发表于 2017-4-19 18:35
太感谢了,从楼主这里学到很多,谢谢。

多谢支持~~

liujinhan 发表于 2017-4-20 08:38:01

赞! 顶! 支持!

谢谢!

raymon 发表于 2017-4-20 08:38:51

mark 好东西

zhenglingo 发表于 2017-4-20 08:40:07

感谢楼主分享。

sunnydragon 发表于 2017-4-20 08:40:27

FireHe 发表于 2017-4-19 18:42
感谢楼主

楼主的开源让我获益良多啊


多谢支持哈~~

开源也需要更多的人一起参与,不管是设计、开发、测试、反馈等等都行,大家互动起来,软件的生态圈才会更加健康发展起来。

sunnydragon 发表于 2017-4-20 08:44:25

gdoujiajia 发表于 2017-4-19 18:51
好东西,之前碰到过HardFault,很难查原因

那就快来试试 CmBacktrace 吧~~完全颠覆传统的 Handfault 解决方法。

xiaomu 发表于 2017-4-20 08:46:53

感谢楼主分享,

jiulong855@.163 发表于 2017-4-20 08:50:53

Handfault 确实是挺不好找原因的,下下来看看

sunnydragon 发表于 2017-4-20 08:51:09

huchunlei 发表于 2017-4-19 18:59
真的是好东西,之前看到有人分析如何定位故障代码,就一直想着有没有开源的库可以用,结果真的来了, 太感 ...

这类小工具 ARM,ST 不一定会在乎了,这也正是我们这些国内开源开发者的优势。更了解开发者,软件才会更接地气~

int 发表于 2017-4-20 08:53:47

谢谢楼主!太强了!

gamep 发表于 2017-4-20 08:53:57

造福众生!!

syj0925 发表于 2017-4-20 08:54:24

太需要这个功能了,每次硬件异常终端,要从LR寄存器去找在哪里挂掉的,但是往往看不出实际原因。

bencsj1 发表于 2017-4-20 08:55:24

NICE 啊,楼主用心了!

dolphinGo 发表于 2017-4-20 08:56:02

佩服楼主的开源精神。

sunnydragon 发表于 2017-4-20 08:57:36

mlnet 发表于 2017-4-19 19:07
感谢感谢,,我想问问这个适合于我们这种小白的业余爱好者吗?

完全适合,CmBacktrace 正是为了降低 HardFault 的处理门槛,让所有的开发者都能更加轻松的解决这类问题。减少重复性工作,让开发者的精力更好的聚焦在软件开发上。

所以,你先试试,有啥问题,可以再跟帖。欢迎多多分享你的感受。

luohui5003 发表于 2017-4-20 08:57:59

这个很方便了 {:victory:}

sunnydragon 发表于 2017-4-20 08:59:11

xiaoergao 发表于 2017-4-19 19:44
嗯 确实是好。但是目前跑的是自己一直的一个轻量级的os不知是否支持。回头测试下。 ...

多谢支持,期待你的反馈~~

sunnydragon 发表于 2017-4-20 09:00:05

wmm20031015 发表于 2017-4-19 20:26
这个比较强大,感谢楼主,下来试试

多谢支持哈~~期待你的试用体验~~

security 发表于 2017-4-20 09:01:23

怎么说呢?
每一个成功男人的背后,总有那么一个默默支持的女人!楼主是幸福的。

虽然我自己很少触发 hardfault,但对于 team 作战而言,还是要时不时与之打交道,关注下。
给楼主赞一个!

tear604922959 发表于 2017-4-20 09:01:30

哇塞,我就知道大神都有好东西

waterx3 发表于 2017-4-20 09:05:45


感谢楼主分享

doushinide 发表于 2017-4-20 09:06:58

楼主开源的几个软件都太给力了{:handshake:}

hxke 发表于 2017-4-20 09:14:27

好东西。。。

NoTimer 发表于 2017-4-20 09:16:26

感谢开源

guolun 发表于 2017-4-20 09:18:33

我也碰到过几次hardfault,只会追踪LR或者PC,到此为止,更深入的不会了。好在解决了。

ltgkl199011 发表于 2017-4-20 09:20:27

mark很好的东西感谢楼主分享

2012Ehome 发表于 2017-4-20 09:20:53

这个软件 不错,再遇到问题可以找到原因,不要重累代码

firewind 发表于 2017-4-20 09:22:51

好东西,感谢LZ分享。。。

sunnydragon 发表于 2017-4-20 09:23:04

tianheiGE 发表于 2017-4-19 20:26
之前我有写过一篇有异曲同工的文章,在Linux中如何利用backtrace信息解决问题,最后我想MCU也可以这么做, ...

多谢支持,我也是看到很多高级语言及 Linux 平台有这类功能,才想到设计 CmBacktrace 。欢迎试用哈,希望你能站在 Linux 角度做下对比,反馈下软件的体验。

sunnydragon 发表于 2017-4-20 09:28:49

R8C 发表于 2017-4-19 20:55
实在看不明白,有什么用

具体哪个章节没有看明白?

sunnydragon 发表于 2017-4-20 09:29:32

honami520 发表于 2017-4-19 21:00
楼主出品,必属精品啊。这个还是挺牛逼的。研究下,加到程序里面去。

多谢支持,用完了,记得反馈体验哈~

lyl2022 发表于 2017-4-20 09:32:24

感谢楼主,辛苦了

zack_cf 发表于 2017-4-20 09:52:33

下面这个错误不知道你的代码能不能定位出来。就是当用SDRAM作为栈空间,函数返回时执行到pop{Rx,Ry,PC}指令,如果下面这种读取错误发生,就会将错误的值读取到PC,就会发生HardFault。这种HardFault发生有很大的不确定性,有时运行10个小时都不发生,有时运行10分钟就发,HardFault的种类也会有变化。若有多个任务,HardFault的位置可能有多个,代码上看不出任何问题,极难定位。
而且由于发生HardFault时,R0~R3,R12,LR,PC,XPSR,这8个寄存器会自动入栈,正好会把栈空间上发生读取错误的位置上的数据覆盖掉,就无法确认是否是栈上的数据真的错了。当然HardFault时入栈的PC值是个异常值,这是可以清楚看到的。

STM32F42xx and STM32F43xx silicon limitations
DocID023833 Rev 10

2.11.5 Interruption of CPU read burst access to an end of SDRAM row

Description:
If an interrupt occurs during an CPU AHB burst read access to an end of SDRAM row, it may result in wrong data read from the next row if all the conditions below are met:
• The SDRAM data bus is 16-bit or 8-bit wide. 32-bit SDRAM mode is not affected.
• RBURST bit is reset in the FMC_SDCR1 register (read FIFO disabled).
• An interrupt occurs while CPU is performing an AHB incrementing bursts read access of unspecified length (using LDM = Load Multiple instruction).
• The address of the burst operation includes the end of an SDRAM row.

Workaround:
Enable the read FIFO by setting the RBURST bit in the FMC_SDCR1 register.

myxiaonia 发表于 2017-4-20 09:58:35

本帖最后由 myxiaonia 于 2017-4-20 11:00 编辑

打算尝试一下,不过要是能够步骤简单一点就更牛了


其实我现在处理hardfalt是用一个结构体恢复出错前的寄存器结构,这个方法也是st的一个应用笔记里提到的,当然arm文档里也有,就是那个权威指南了,rtt的代码里也有这个实现啊

一般情况下很快就能定位到出错时的pc指针

Pupil 发表于 2017-4-20 10:19:19

已粉楼主

yijiangshan 发表于 2017-4-20 10:25:23

太感谢了,建议申请精华帖,这个东西很有用的。楼主无私

asbzhang 发表于 2017-4-20 10:30:14

给楼主赞一个

mii 发表于 2017-4-20 11:07:10

楼主厉害,前几次小项目遇到硬件中断也是生不如死,调试好久才解决。到时试试这个库

huangqi412 发表于 2017-4-20 11:32:18

楼主真是开源达人。

bushiniu 发表于 2017-4-20 11:36:22

太强了哈

dragonbbc 发表于 2017-4-20 11:50:33

这个好,HardFault有时候真的够烦的

xd785 发表于 2017-4-20 12:00:39

好东西,感谢楼主分享

7nian 发表于 2017-4-20 12:19:29

楼主的几个项目都很牛,elog现在好在用。

renjun_EMbest 发表于 2017-4-20 12:27:21

前排留名,顶大神

kaomantou 发表于 2017-4-20 12:32:38

牛叉,精品,酷前马克~~~~~~

LCH201328 发表于 2017-4-20 12:43:16

牛人历害,改天试试

zhang0352505 发表于 2017-4-20 12:46:46

很不错,开源的都值得称赞

li.wen 发表于 2017-4-20 12:51:13

sunnydragon经常开源一些好东西啊,大赞!

myrgb 发表于 2017-4-20 13:03:39

感谢牛人的分享
页: [1] 2 3 4
查看完整版本: 【开源】ARM Cortex-M 错误追踪库,让 HardFault 不再可怕