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

(1)程序出现崩掉原因

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

如下代码:

#include <stdio.h>

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

debug模式下运行结果如下:

release模式下运行结果如下:

(2)分析

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

for (i=0; i<Air1Num; 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写类时,一定要对必要的成员变量初始化;

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

  1. 天正安装autocad启动失败_天正T20-V2.0版本,在WIN764位系统下运行AUTOCAD2007 不成功,提示AUTOCAD启动失败...

    把天正的sys19x64(有时候为2113sys18x64)文件夹里的文件tch_AdoShell.exe的属性做5261调整:以管理员的身4102份运行1653即可.这样操作以后,问题就解决了.记得 ...

  2. 关于release版本和Debug 版本的问题 终结

    阅读笔记: 总之就是,平时尽量在release下运行,如果出错再到debug里查找错误. 我由此从头到尾都用debug,调好了之后用release发布,一大堆错误,哪里出错找都找不到----heyzo ...

  3. Debug版本下能运行而Release下不能运行的问题总结

    引言      如果在您的开发过程中遇到了常见的错误,或许您的Release版本不能正常运行而Debug版本运行无误,那么我推荐您阅读本文:因为并非如您想象的那样,Release版本可以保证您的应用程 ...

  4. 关于Debug版正常运行,release版运行崩溃的问题

    关于Debug版正常运行,release版运行崩溃的问题 通常情况下,Debug版用于程序的调试优化,尽可能将遇到的BUG找到并解决掉: 这样编译出的Release版才可能有效可靠的运行.然而如果编译 ...

  5. release版本和debug版本

    程序一般分为Debug版本和Release版本,Debug版本用于内部调试,Release版本发行给用户使用 Release和Debug有什么不同 Release版称为发行版,Debug版称为调试版. ...

  6. POPTEST老李谈Debug和Release的区别(c#) 1

    POPTEST老李谈Debug和Release的区别(c#) poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请 ...

  7. VC++调试程序、快捷键以及Debug版本与Release版本

    1.如何在Release状态下进行调试 Project->Setting=>ProjectSetting对话框,选择Release状态.C/C++标签中的Category选General, ...

  8. linux release 版本的区别,编译debug版本和编译release版本的区别

    大项目的版本编译会区别debug和release,那debug和release会有什么区别呢? 通过对比这两者的编译选项可以找到答案. 1.对比编译过程 debug: -DOS_LINUX  -DDE ...

  9. android 测试人员测试时使用release版本还是debug版本_为什么做软件测试

    软件测试是使用人工或自动的手段来运行或测定某个软件系统的过程,其目的在于检验它是否满足规定的需求或弄清预期结果与实际结果之间的差别. 软件测试包括:发现软件程序中的错误.是否符合设计要求,是否符合技术 ...

  10. flex发布的release程序要配release的Flash Player,速度飞快!如果有一方是debug版本的,速度就降下来了,要注意!...

    flex发布的release程序要配release的Flash Player,速度飞快!如果有一方是debug版本的,速度就降下来了,要注意! 有时自已发布的release程序,感常和debug速度差 ...

最新文章

  1. ElasticSearch(3)-安装kibana
  2. asp.net chart美化+绑定数据--饼图
  3. python中outside loop_Python: 'break' outside loop
  4. Java入门之HelloWorld
  5. WordPress 运行流程分析
  6. JavaScript中属性name与方法名不能相同
  7. struts2 mysql 分页代码_Struts2 + MySQL 实现分页
  8. SAP UI5 初学者教程之二十七 - SAP UI5 应用的单元测试工具 QUnit 介绍试读版
  9. kafka php 0.8,php5.6 centos7 kafka0.8.1
  10. Spring Data JPA 禁止自动更新
  11. 编写有效用例电子版_软件测试人员必须编写代码吗?
  12. 《DSP using MATLAB》Problem 6.6
  13. WinServer2008R2搭建和授权DHCP服务器详解
  14. 使用VirtualHostX时如何编辑虚拟机内的文件?
  15. Java语言基础--集合
  16. vue 在线预览word、excel、pdf、txt、图片
  17. 如何从12306网站下载自己喜欢的手机铃声
  18. 行测 资料分析 统计术语篇
  19. 长沙python培训_长的解释|长的意思|汉典“长”字的基本解释
  20. java读取ini文件工具_Java读取ini文件 [org.dtools.javaini]

热门文章

  1. [含论文+ppt+任务书+源码等]S2SH基于java的保险业务管理系统
  2. CADD课程学习(7)-- 模拟靶点和小分子相互作用 (半柔性对接 AutoDock)
  3. 红外遥控器解码串口输出模块结合51单片机+oled屏幕实现遥控器红外解锁( STC89C52RC)
  4. 提高效率:17款超赞的谷歌chrome浏览器插件、扩展程序
  5. 移远4G模组EC600N进行TCP/IP连接和服务器测试
  6. 关于ACM竞赛的题型分析
  7. 【解决方案】重新安装Ubuntu显卡驱动
  8. neo4j ,neo4j-desktop国内下载镜像
  9. 采集侠-免费采集侠-免费采集侠插件
  10. 公制螺纹与英制螺纹区别