MFC 堆栈溢出 test dword ptr [eax],eax ; probe page.

今天调试程序的时候,发现一个奇怪的问题,之前调试都没问题的,今早加了一点东西,就出现错误,跳到调试位置,如下4行红色部分

1 ; Find next lower page and probe
2 cs20:
3         sub     eax, _PAGESIZE_         ; decrease by PAGESIZE
4         test    dword ptr [eax],eax     ; probe page.
5         jmp     short cs10
6
7 _chkstk endp
8
9         end

感觉好奇怪,然后断点调试,连程序的入口都没进就出现了这个错误,好郁闷。

然后百度一下,原来是因为局部变量申请的空间过大,大于了1M。

局部变量的申请空间是存放于栈中,windows里默认栈内存是1M,所以当申请空间大于1M时就会出现溢出错误。

查看了一下源代码,原来今天早上增加了一个结构体数组,数组超出堆栈的大小了。

在类中有如下定义:

    //色亮度数据
    struct LXY
    {
        float L; //亮度
        float x; //色度x
        float y; //色度y
    };

    LXY LxyData[HIGHTH][WIDTH]; //整个画面数据
    

另外

1 #define WIDTH  640  //像素宽度
2 #define HIGHTH 480  //像素高度

这样下来这个数组所占的空间为 640*480*(4+4+4)= 3686400B = 3600KB = 3.515625M

对于这种情况,解决办法就是修改数组的定义,换成动态数组

1 CArray<LXY,&LXY> LxyData;

要么就是扩大栈空间的大小。

扩大空间堆栈大小的方法是

Project->Properties->Configuarations Properties->Linker->System->Stact Reserve Size

例如修改成5M,可以输入5242880

1024*1024*5 = 5242880

这样修改后程序就可以正常运行了。

俩儿子

时间: 2024-12-20 09:29:45

MFC 堆栈溢出 test dword ptr [eax],eax ; probe page.的相关文章

windows堆栈溢出利用的七种方式

文本由 www.169it.com 搜集整理 windows下的堆栈溢出攻击和unix下的,原理基本相同.但是,由于windows用户进程地址空间分配和堆栈处理有其独立的特点,导致了windows 环境下堆栈溢出攻击时,使用的堆栈溢出字符串,与unix下的,区别很大.另外,windows的版本也导致了windows下的exploit不具有通用性.windows版本不同,而exploit使用了很多动态链接库里面的库函数,其地址都是与dll的版本有关系的.不同的dll版本,里面的库函数的偏移地址就可

关于 DWORD PTR [EAX]

DWORD PTR [EAX] 的意思: 如果eax的值,即eax中存放的值是400080H, 那么DWORD PTR [EAX]指的是:内存地址400080H中存放的值404000H

mov eax, dword ptr [esi]指令区别

mov eax,esi 将esi中的数据传送到eax中 mov eax,[esi] esi中是地址,将内存中该地址的数据传送到eax中,也就是间接寻址 mov eax, dword ptr [esi] dword表示的是双字,四字节.esi中保存的是为内存中的地址.将该地址处的4字节数据传送到eax中. 版权声明:本文为博主原创文章,未经博主允许不得转载.

【原创】uC/OS 中LES BX,DWORD PTR DS:_OSTCBCur的作用及原理

1 LES BX, DWORD PTR DS:_OSTCBCur ;取得任务堆栈指针ES:[BX] 2 MOV ES:[BX+2], SS ;将当前SS(栈的基地址)寄存器值存放至当前任务堆栈的2,3内存单元 3 MOV ES:[BX+0], SP ;将当前SP(栈顶的偏移量)存放至当前任务堆栈的0,1内存单元 首先讲讲LES指针的功能:LES的功能有点像C语言的*. LES REG,MEM 参与操作的寄存器不仅有REG,还有ES寄存器.在16位系统中,寄存器为16位,很显然,MEM所指向的内存

STM32/GD32上内存堆栈溢出探测研究

无数次遭受堆栈溢出折磨,随着系统变得复杂,故障点越来越难以查找!主要溢出情况如下:1,一般RAM最后两块空间是堆Heap和栈Stack,堆从下往上用,栈从上往下用,任意一个用完,都会进入对方的空间2,如果栈用完,进入堆的空间,这个时候系统是不会有任何异常的,也就是说,栈底没有什么意义.除非堆和栈指针重叠,否则大家相安无事,尽管栈用了堆的3,如果栈用完进入堆,并且还碰到了堆的空间,这个时候系统仍然没有异常,但是堆栈会相互修改数据.最悲剧的就是栈里面保存的然会地址lr,一旦被堆指针修改,返回的时候就

js堆栈溢出错误

function prompt() { var answer = prompt("What is your name","") if (answer) { alert("Hello, " + answer + "!"); } } 提示堆栈溢出.我就纳闷了. 反复测试之后,发现原来函数名不能命名为prompt. function prompttt() { var answer = prompt("What is you

Delphi2010启动报错:‘displayNotification: 堆栈溢出

今天启动delphi2010报错: ‘displayNotification: 堆栈溢出 在网上搜索了下,解决方法: 1.清理IE的历史记录,删除浏览器缓存...一定要清楚默认浏览器的历史缓存,我平常用的是谷歌,系统默认的是360.......... 2.去掉delphi2010的欢迎界面(welcome page) 在注册表里找到 HKEY_CURRENT_USER\Software\codegear\BDS\7.0\Known IDE Packages删除右边的数据项: ($BDS)\Bin

IE11下javascript报堆栈溢出问题的解决

在IE11浏览器下,使用日期函数里面的toLocaleDateString()会报堆栈溢出 不知道是不是跟我的其他相关代码有关,还是就是这个toLocaleDateString()在IE11确实不太一样,不管了,解决问题就行. 修改之前的代码: var myDate= new Date(); var str = myDate.toLocaleDateString(); 修改之后的代码: var myDate= new Date(); var str = myDate.getFullYear()

Microsoft SQL Server 堆栈溢出漏洞加固

Microsoft SQL Server 堆栈溢出漏洞 官网https://technet.microsoft.com/zh-cn/library/security/ms14-085.aspx 下载对应SQLServer2008R2-KB2977320-x64补丁