因仑“3+1”工程特种兵精英论坛

标题: STM32发生HardFault_Handler错误的查找方法 [打印本页]

作者: 谭力源    时间: 2016-6-6 17:59
标题: STM32发生HardFault_Handler错误的查找方法
我遇到的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!





欢迎光临 因仑“3+1”工程特种兵精英论坛 (http://bbs.enlern.com/) Powered by Discuz! X3.4