谈debug版本可以正常运行,而在release下运行出错之原因及避免类似情况发生

以前在学校时,经常碰到这样的情况:程序在Debug模式下运行的好好的,可是一换到Release模式下,就出错,实在很郁闷,而当时还经常天真的以为是工程文件有问题,也没有去分析原因;直到上次有位同事也碰到类似的问题,于是想拿那个程序来开开刀~

(1)程序出现崩掉原因

程序出现崩掉,一般都是访问到非法地址或数组越界访问了;但为什么debug可以,而release不行呢?于是就需要分析debug模式与release模式有什么区别,通过查阅,发现Debug模式下,栈会被初始化为0xCC(0xCC为单步调试指令的机器码),即对变量进行了赋值操作,如定义一个int c,则在运行后c将被初始化为0xcccccccc;而在release模式下,编译器并没有对栈初始化,导致变量将是一个随机值;下面通过代码来验证一下(以下代码均在vc++6.0下运行)

如下代码:

#include

void main()
{
    int c;
    printf("c = 0x%0x\n", c);
}

debug模式下运行结果如下:

release模式下运行结果如下:

(2)分析

下面回到正题上,通过上面可以知道了debug与release的不同所在,于是可以猜测是程序中未对某些变量进行初始化引起的,因为如果有对变量进行初始化,则debug模式下和release模式下运行应该是一样的效果;于是我查阅了一下代码,发现如下一段代码存在问题:

    for (i=0; i     {
        index = GetCtrlID(EV_ID_TYPE_AIR1, i);
        GetDlgItem(index)->EnableWindow(TRUE);
        GetDlgItem(index+1)->EnableWindow(TRUE);
        GetDlgItem(index+2)->EnableWindow(TRUE);
        GetDlgItem(index_static + i)->EnableWindow(TRUE);
    }

其中Air1Num就是一个未初始化的变量,如果是debug模式,由于Air1Num=0xcccccccc,是个负数,则不会执行for循环内的代码,自然不会出错;而在release下,Air1Num是一个随机值,当这个随机值是个比较大的正数时,就会造成访问越界,从而导致程序崩掉;


总结:

通过以上分析,我们可以得出,是由于我们自己有时候太懒,把一些事留给了编译器做了,这样就有可能导致大问题;所以建议我们在编程时,特别是利用vc写类时,一定要对必要的成员变量初始化;





你可能感兴趣的:(编程)