STM32 ~ MDK环境下调试程序 HardFault_Handler 相关
2018-02-01 14:17
351 查看
STM32出现HardFault_Handler故障的原因主要有两个方面:
1、内存溢出或者访问越界。这个需要自己写程序的时候规范代码,遇到了需要慢慢排查。
2、堆栈溢出。增加堆栈的大小。
出现问题时排查的方法:
1、添加软件断点,一旦在调试过程中出现Hard Fault 则会停在__breakpoint(0)处。
当进入HardFault断点后,菜单栏Peripherals >Core Peripherals >FaultReports打开异常发生的报告,查看发生异常的原因。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/22/77a9b9b78baf1e4c13dd601350015f10.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/22/1a732a1c1a7822b8eba82eeb43dd6b71.png)
上面的报告发生了BUS FAULT,并将Fault的中断服务转向Hard Fault。
相对于检测发生了什么异常,定位异常发生位置显得更重要。
(1)打开Call Stack窗口(如下图左侧,断点停在Hard Fault服务程序中)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/22/512855b1c1ca640c40dbe5e63707970f.png)
(2)在Call Stack的HardFault_Handler上右键Show CallerCode(有的Keil版本也可以直接双击)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/22/4721d7251a740065728286738a94d24b.png)
这时将跳转到发生异常的源代码位置(如上图),异常发生在p->hour=0这一行。这里错误很明显:指针p尚未为成员变量分配内存空间,直接访问未分配的内粗空间肯定出错。
补充:
[1] 在复杂的情况下,即使定位了异常发生位置也很难容易的改正错误,要学会使用Watch窗口对发生错误的指针变量进行跟踪;
[2]在问题不明晰的情况下,尝试分析反汇编代码,就自己遇到的,部分情况下的异常发生在BL等跳转指令处,BL跳转到了不合法的内存地址产生异常
1、内存溢出或者访问越界。这个需要自己写程序的时候规范代码,遇到了需要慢慢排查。
2、堆栈溢出。增加堆栈的大小。
出现问题时排查的方法:
1、添加软件断点,一旦在调试过程中出现Hard Fault 则会停在__breakpoint(0)处。
void HardFault_Handler(void) { if (CoreDebug->DHCSR & 1) { //check C_DEBUGEN == 1 -> Debugger Connected __breakpoint(0); // halt program execution here } while (1) { } }
当进入HardFault断点后,菜单栏Peripherals >Core Peripherals >FaultReports打开异常发生的报告,查看发生异常的原因。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/22/77a9b9b78baf1e4c13dd601350015f10.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/22/1a732a1c1a7822b8eba82eeb43dd6b71.png)
上面的报告发生了BUS FAULT,并将Fault的中断服务转向Hard Fault。
相对于检测发生了什么异常,定位异常发生位置显得更重要。
(1)打开Call Stack窗口(如下图左侧,断点停在Hard Fault服务程序中)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/22/512855b1c1ca640c40dbe5e63707970f.png)
(2)在Call Stack的HardFault_Handler上右键Show CallerCode(有的Keil版本也可以直接双击)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/22/4721d7251a740065728286738a94d24b.png)
这时将跳转到发生异常的源代码位置(如上图),异常发生在p->hour=0这一行。这里错误很明显:指针p尚未为成员变量分配内存空间,直接访问未分配的内粗空间肯定出错。
补充:
[1] 在复杂的情况下,即使定位了异常发生位置也很难容易的改正错误,要学会使用Watch窗口对发生错误的指针变量进行跟踪;
[2]在问题不明晰的情况下,尝试分析反汇编代码,就自己遇到的,部分情况下的异常发生在BL等跳转指令处,BL跳转到了不合法的内存地址产生异常
相关文章推荐
- 从零开始搭建基于Xcode7的IOS开发环境和免开发者帐号真机调试运行第一个IOS程序HelloWorld
- VS2013 利用msvsmon远程调试发布到服务器IIS上程序环境配置
- stm32系统在线调试时程序运行正常输出正常,但是一旦把程序烧写进去则输出不正常
- android 学习笔记(五)调试相关 5.5 eclipse中ndk环境
- 【MDK调试经验】 程序死在BEAB BKPT 0xAB汇编的解决办法
- 从零开始搭建基于Xcode7的IOS开发环境和免开发者帐号真机调试运行第一个IOS程序HelloWorld
- VS2015编译的程序在其他电脑上运行不依赖VS相关运行环境
- [ M3 PN ] STM32F10XXX(Cortex-M3) MDK + J-Link环境搭建 建立工程 下载程序
- 配置PPC模拟器网络环境,调试TCP/UDP套接字程序
- 用VIM结合Keil(MDK)写STM32、C51等程序
- android eclipse 程序调试及相关快捷键
- STM32开发环境配置相关问题记录
- 在VC环境下调试C程序的操作方法简介
- stm32 HardFault_Handler调试及问题查找方法
- .NET Windows客户端程序在代理环境下的相关设置
- STM32 jtag调试程序时程序跑飞
- Linux环境下的堆栈--调试C程序
- [IOS]从零开始搭建基于Xcode7的IOS开发环境和免开发者帐号真机调试运行第一个IOS程序HelloWorld
- stm32系统在线调试时程序运行正常输出正常,但是一旦把程序烧写进去则输出不正常
- Linux环境下使用GDB调试C程序