在堆栈中找不到函数(具有溢出语句)

时间:2011-05-23 17:57:50

标签: stack-overflow windbg

3 个答案:

答案 0 :(得分:2)

当程序试图分配一个巨大的基于堆栈的变量时,将发生堆栈溢出。当您第一次进入该函数时,程序计数器将进入该函数,但它不会执行它(包括初始化和堆栈变量分配)。但是,只要再次进入,它就会使用操作码分配堆栈变量:

sub esp, xxx; //xxx is the size of the stack variable

如果esp-xxx的结果超出了堆栈内存页面,它将抛出堆栈溢出。因为它会在你第二次进入时分配堆栈变量,所以你马上就知道你在变量声明中犯了一些错误。

解决方法是:

  1. 增加堆栈大小(项目设置 - >链接器 - >系统 - >堆栈大小)
  2. 在堆中分配变量。
  3. 当您递归调用太多次时,也会发生堆栈溢出。大多数函数都需要在堆栈中进行一些临时存储。如果你尝试分配这么多次,它将超出内存。这个着名的例子是递归地调用自身以找到斐波那契序列的函数。当n超过100000时,通常会(假设堆栈大小为1MB,这是VS的默认大小)导致堆栈溢出。

    唯一的解决方案是增加堆栈大小。

答案 1 :(得分:0)

我想这是因为以下行分配给堆栈上的大量内存:

 BYTE bTemp[OneKilo * 1024];

尝试在堆上分配数据:

 BYTE *bTemp = new Byte[OneKilo * 1024];

不要忘记随后释放内存

答案 2 :(得分:0)

_chkstk没有建立ebp链并且正在修改堆栈帧,这可能导致调试器无法正确展开堆栈。

如果您反汇编_chkstk,您可能会找到存储返回地址的位置。在下面的示例中,它位于ecx寄存器中。

0:000> u ntdll!_chkstk
ntdll!_chkstk:
778fad68 51              push    ecx
778fad69 8d4c2404        lea     ecx,[esp+4]
778fad6d 2bc8            sub     ecx,eax
778fad6f 1bc0            sbb     eax,eax
778fad71 f7d0            not     eax
778fad73 23c8            and     ecx,eax
778fad75 8bc4            mov     eax,esp
778fad77 2500f0ffff      and     eax,0FFFFF000h
0:000>