如何查找栈溢出(stack overflow)的问题

背景:在日程调试过程中,经常会出现一些莫名奇妙的现象,例如函数返回时返回的地址是一个不存在的地址。这些都可能是发生了栈溢出导致的。因此我们在日常调试过程中,需要知道是否发生了栈溢出,以及如果发生了栈溢出具体是哪个stack

背景知识:

什么是栈?

栈是在RAM空间的一段范围,里面是专门用来存放临时变量和函数调用时的上下文等内容。

保存的内容按照从高地址往低地址存放。一般高地址的叫做栈底,低地址叫做栈顶。例如栈的范围为0x7000 0000 -0x7000 0FFF,那么0x7000 0FFF就是栈底,0x7000 0000是栈顶

什么是栈溢出?

如果在stack中保存的内容超过了栈的范围,就发生了栈溢出。

栈溢出的应对方法:

情景一:没有打开MPU功能的情景

1.在OS中打开Stack Monitoring功能。

图片

2.打开这个功能后在栈顶的位置会有固定的内容AA AA AA AA , 因为栈保存的内容是从栈底往栈顶存放,所以如果AA AA AA AA的内容不存在了,那就说明保存的内容超过栈顶了,此时发生了栈溢出。

图片

解决措施:

在Os_StackOverflowCheck 添加测试代码,如果判断条件成立,说明发生了栈溢出,记录此时的指针stackEnd的内容查找具体是哪个栈,通过增加栈的size来解决问题

图片

情景二:打开MPU功能的情景

解决措施:

单独为stack配置os region,如果发生了栈溢出,会报出memory fault的错误。具体如何配置可以查看MPU部分讲解的内容或者与我们取得联系。

如果有更多的问题需要咨询,可以加入我们的付费咨询群与我们进行讨论,qq群号:531159112

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值