win32线程栈溢出问题
Posted yilang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了win32线程栈溢出问题相关的知识,希望对你有一定的参考价值。
3.2、函数递归调用引发的栈溢出
写一段最简单的无穷递归代码,如下:
#include "stdafx.h" void f(void) f(); int _tmain(int argc, _TCHAR* argv[]) f(); return 0;
在VS编译,Debug模式下运行之,结果报错
观察下调用栈,发现栈没有破坏,但被大量的f()调用沾满,如下:
这也充分说明了,是递归调用引起了栈溢出
转到汇编,在地址栏里输入上面错误框里的地址0x011515C9
可以看到,程序是在执行一次入栈操作时,报错了
我们转到Windbg运行程序,观察下
看下相关寄存器的值
栈顶指针esp=0x000a2f78
在看下线程栈下限
栈区界限下限为0x000A1000,然而,此时esp=0x000a2f78,已经非常接近下限了。0x000a2f78-0x000A1000=0x1f78<0x2000,也就是说,限制esp已经进入到栈区的后两个保护页了,当线程访问到倒数第三个页面的的时候,系统会为倒数第二个页面调拨物理存储器,此时还会抛出EXCEPTION_STACK_OVERFLOW。
针对函数递归调用而引起的栈溢出,我们可以采用下面的方式来解决:
- 给递归调用加上退出机制
- 改变设计,不用递归,比如可以用循环语句替代
以上是关于win32线程栈溢出问题的主要内容,如果未能解决你的问题,请参考以下文章
STM32H7第10章 ThreadX任务栈大小确定及其溢出检测
STM32F429第10章 ThreadX任务栈大小确定及其溢出检测