查看: 2058|回复: 0
打印 上一主题 下一主题

STM32发生HardFault_Handler错误的查找方法

[复制链接]
跳转到指定楼层
沙发
发表于 2016-6-6 17:59:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我遇到的HardFault_Handler错误的原因最最多的原因是数组越界以及指针指飞,其实这两个是差不多的,都是访问了不该访问的地方导致了错误,就像一个路痴,漫无目的的走到了一个陌生的地方……然后就迷路了……然后就木有然后了……(貌似是第一次写原创,我该如何装成经常写的样子……)
以前查找这种错误时比较盲目,就是在程序中缕着流程一步步的查找,逐个屏蔽进行排除,在程序隔一段加个while(1),以及通过串口发出错误状态日志等……这些方法都效率低下,不易查找。相比之下,查看堆栈的方法更加实用,效率也高。
在HardFault_Handler中的while(1)设置断点,然后运行,给它触发HardFault_Handler的条件,然后到断点处之后,查看watch窗口中的Call Stack+Local,也就是堆栈以及局部变量,程序执行到哪一句发生的错误,以及当时各个压栈的函数的各个局部变量的值一目了然,这里记录了死者临死前的五分钟到底对自己做了什么傻事……
如下图,就是对一个地址为NULL的空指针 p 进行解引用操作造成的HardFault_Handler错误

Call Stack+Local窗口内显示了发生错误之前的程序状态,当然,这只是导致程序错误的直接原因,有时候想要找到根源还是要继续花好大的一番功夫的,累积性的,概率性的死机(比如昨天……找BUG的这一惨痛经历,这里就不多说了,说多了全是眼泪……),但是至少是提供了一个瓜藤,你需要做的就是顺藤摸瓜了~把这个BUG消灭掉!


同样的方法还可以扩展到其他编程环境中。各位看客举一反三即可。(截图中是Keil)总之就是一句话:查看错误发生时的堆栈情况。

同样,在visual studio中:

同样,在这里用对空指针进行解引用操作这种错误作为例子,同样通过查看调用堆栈方式以及局部变量来确定错误的位置(当然,没人会像我截图中那样使用,这里只是想凸显一下压栈以及确定错误位置的过程),接下来的工作同样是顺藤摸瓜。
当然,这只是发生HardFault_Handler错误的一种情况而已,像其他还有堆栈溢出,除数为0之类的也会发生该错误。欢迎补充。
还是那句话,不存在不存在BUG的程序,别说Hello World!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

快速回复 返回顶部 返回列表