Win32 Debug & Release
今天帮汤老师调试程序,他生成的程序不能运行,怀疑子程序之间编译顺序的问题;我试了之后,也出现同样的问题,但是把Win32 Debug 换成Win32 Release却可以运行了。
网上搜索了下,在CVF开发平台下两种编译版本Release 和Debug特点如下:
Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。
Debug 和 Release 的真正秘密,在于一组编译选项。下面列出了分别针对二者的选项(当然除此之外还有其他一些,如/Fd /Fo,但区别并不重要,通常他们也不会引起 Release 版错误,在此不讨论):
Debug模式:
| /MDd /MLd 或 /MTd | 使用 Debug runtime library(调试版本的运行时刻函数库) |
| /Od | 关闭优化开关 |
| /D "_DEBUG" | 相当于 #define _DEBUG,打开编译调试代码开关(主要针对 assert函数) |
| /ZI | 创建 Edit and continue(编辑继续)数据库,这样在调试过 程中如果修改了源代码不需重新编译 |
| /GZ | 可以帮助捕获内存错误 |
| /Gm | 打开最小化重链接开关,减少链接时间 |
Release模式:
| /MD /ML 或 /MT | 使用发布版本的运行时刻函数库 |
| /O1 或 /O2 | 优化开关,使程序最小或最快 |
| /D "NDEBUG" | 关闭条件编译调试代码开关(即不编译assert函数) |
| /GF | 合并重复的字符串,并将字符串常量放到只读内存,防止 被修改 |
实际上,Debug 和 Release 并没有本质的界限,他们只是一组编译选项的集合,编译器只是按照预定的选项行动。事实上,我们甚至可以修改这些选项,从而得到优化过的调试版本或是带跟踪语句的发布版本。
通常 /GZ 选项会造成 Debug 版出错而 Release 版正常的现象,因为 Release 版中未初始化的变量是随机的,这有可能使指针指向一个有效地址而掩盖了非法访问。
CSDN论坛也指出:“一个为调试版本,其中包括了出错时能够定位源代码的在行,如果源文件已经改变,定位出来会有偏移,而且,在这个版本中编译器不会进行代码优化,并且在程序中能用宏定义_DEBUG来确定当前的版本。另一个为正试版本,程序出错只是进行简单的错误处理,编译器会优化代码,以提高性能。”
Release代码更小,执行更快,编译更严格,更慢;当然就没有了调试信息。Debug自动进行变量初始化,而release不进行变量初始化。debug和release还有一个区别,就是编译成的exe,dll,lib文件的size差别很大。
另外还有Release出错,Debug运行正常的情况,例如CSDN论坛提到的:“一个通讯程序,分两块,一个是主程序,一个是一个dll,主程序由多个线程组成,通过loadlibrary调用dll的函数。debug运行正常,经过压力测试也没有什么问题。可是release一跑就飞掉。出错的位置不是太固定,基本上都是释放内存的地方。”
这种情况的解决方案详见参考链接[3,4]。
参考链接:
[2] fortran调试debug 和release 的用法
[3] debug版运行正常,为啥release运行不正常? debug和release的区别?
[4] 谈debug版本可以正常运行,而在release下运行出错之原因及避免类似情况发生
[5] Win32 Release 和 Win32 Debug有什么不同
Win32 Debug & Release的更多相关文章
- Debug, Release区别
Debug, Release区别 Debug附加了很多调试信息,主要用于调试,所以文件大 Release就是经过优化的版本,去除了调试信息,进行了代码优化,所以文件较小,同时速度要快于Debug De ...
- iOS enum C方法 DEBUG, RELEASE的隐藏的一个坑
开发了一个app, 在debug模式下没有任何问题,在release模式下就直接崩溃. 经过一段时间的定位终于定位到如下的这一段代码: E_BZ_TestType type = [dic[@" ...
- win10+vs2015+opencv3.0 x86/x64配置(debug+release)
最近做一些图像识别的项目,用到了opencv,opencv3.1没有x86版本,所以只能用opencv3.0来完成,下面介绍一下在window10下vs2015 配置opencv3.0的过程(x86和 ...
- iOS开发之 Xcode 5 下让你的应用在不同状态(debug, release)有不同的图标
http://nickcheng.com/post/unique-icons-for-your-app-in-different-state-in-xcode5-debug-release 应用在发布 ...
- debug && release
http://www.cnblogs.com/awpatp/archive/2009/11/05/1597038.html Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调 ...
- delphi debug release区别是什么?
1. 基础知识介绍: Debug编译:是为了便于程序调试,所以目标代码里附加有许多额外的东西.Release编译:是产品可作为正式拷贝发布了,已经不需要那些仅为调试而编译进去东西. (在 Releas ...
- 批处理清理VS工程目录(递归删除Debug, Release, ipch目录及*.sdf文件)
用VS写程序最烦的就是VS会产生一大堆乱七八糟的东西,如Degub, Release, ipch目录,还有sdf文件,这些东西占了很大的空间,在linux下编程的话一个make clean就可以很方便 ...
- iOS 设置不同环境下的配置 Debug Release 生产 测试 等等
其实这个问题大家都知道,但是一般都是清楚一些皮毛的东西,只能进行一些简单的应用.在这里详细说一下模式切换的使用. Xcode给我们自带了两种编译模式Release 和 Debug,通常情况下我们可以利 ...
- iOS debug release
去掉日志 #ifndef __OPTIMIZE__ #define NSLog(...) NSLog(__VA_ARGS__) #else #define NSLog(...){} #endif 打开 ...
随机推荐
- bzoj 3978: [WF2012]Fibonacci Words
Description 斐波那契01字符串的定义如下 F(n) = { 0 if n = 0 1 if n = 1 F(n-1)+F(n-2) if n >= 2 } 这里+的定义是字符串的 ...
- HTTP Status 500 - The absolute uri: http://java.sun.com/jsp/jstl/core cannot-报错解决方法
操作:jsp文件里面添加<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" % ...
- zabbix企业应用:通过SNMP和iDRAC监控DELL服务器硬件
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://qicheng0211.blog.51cto.com/3958621/174998 ...
- (转)Win7 64位系统下 Retional rose 2003 安装及破解
网上关于Retional rose 2003安装和破解的文章比较多,这里,我结合自己的亲身体验,和大家分享一下win7 旗舰版 64位系统下Retional rose 2003(下面简称rose200 ...
- 一份CTR的特征工程图
- 关于javascript的cookie的封装
/******************cookie*********************/ /* cookie的组成部分: 名称:唯一值,不区分大小写,必须经过URL编码 值:必须经过URL编码 ...
- 由一条普通的link引用引发的无数问号,大家能回答的帮忙回答回答吧.
<link type="text/css" rel="stylesheet" href="1.css" /> 对于前台工作者来说 ...
- ICML论文|阿尔法狗CTO讲座: AI如何用新型强化学习玩转围棋扑克游戏
今年8月,Demis Hassabis等人工智能技术先驱们将来到雷锋网“人工智能与机器人创新大会”.在此,我们为大家分享David Silver的论文<不完美信息游戏中的深度强化学习自我对战&g ...
- Neuromation新研究:利用卷积神经网络进行儿童骨龄评估
近日,Neuromation 团队在 Medium 上撰文介绍其最新研究成果:利用卷积神经网络(CNN)评估儿童骨龄,这一自动骨龄评估系统可以得到与放射科专家相似或更好的结果.该团队评估了手骨不同区域 ...
- solr6.3根据搜索关键词词频(关键词出现次数、关键词highlight)进行排序
http://localhost:8080/solr/test/select?fq=product_name:大有&indent=on&q=product_name:大有电钻 OR r ...