zoukankan      html  css  js  c++  java
  • 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

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

    俩儿子

  • 相关阅读:
    软件测试(理论基础)
    Android NDK常见配置问题的解决方案
    Eclemma各种安装方式以及安装失败解决
    检测Buffer Overflow的几种方法
    转: 跟我一起写 Makefile
    流敏感、路径敏感、上下文敏感
    Symbolic Exectuion with Mixed ConcreteSymbolic Solving
    基于ajc的代码编织
    第一次个人编程作业
    第一次博客作业
  • 原文地址:https://www.cnblogs.com/fredliu/p/4845563.html
Copyright © 2011-2022 走看看