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