码迷,mamicode.com
首页 > 编程语言 > 详细

win32线程栈溢出问题 (二)

时间:2019-08-17 14:41:44      阅读:102      评论:0      收藏:0      [点我收藏+]

标签:turn   线程   bug   ack   char*   地址   说明   deb   代码   

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线程栈溢出问题 (二)

标签:turn   线程   bug   ack   char*   地址   说明   deb   代码   

原文地址:https://www.cnblogs.com/yilang/p/11367942.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!