1。Debug和Release有什么区别,为什么要使用Release版本! 
2。怎么把Debug转成Release
Debug版本包括调试信息,所以要比Release版本大很多(可能大数百K至 数M)。至于是否需要DLL支持,主要看你采用的编译选项。如果是基于ATL的,则Debug和Release版本对DLL的要求差不多。如果采用的编译 选项为使用MFC动态库,则需要MFC42D.DLL等库支持,而Release版本需要MFC42.DLL支持。Release Build不对源代码进行调试,不考虑MFC的诊断宏,使用的是MFC Release库,编译十对应用程序的速度进行优化,而Debug Build则正好相反,它允许对源代码进行调试,可以定义和使用MFC的诊断宏,采用MFC Debug库,对速度没有优化。    
一、Debug 和 Release 编译方式的本质区别 
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 并没有本质的界限,他们只是一组编译选项的集合,编译器只是按照预定的选项行动。事实上,我们甚至可以修改这些选项,从而得到优化过的调试版本或是带跟踪语句的发布版本。 
二、哪些情况下 Release 版会出错 
有了上面的介绍,我们再来逐个对照这些选项看看 Release 版错误是怎样产生的 
1. Runtime Library:链接哪种运行时刻函数库通常只对程序的性能产生影响。调试版本的 Runtime Library 包含了调试信息,并采用了一些保护机制以帮助发现错误,因此性能不如发布版本。编译器提供的 Runtime Library 通常很稳定,不会造成 Release 版错误;倒是由于 Debug 的 Runtime Library 加强了对错误的检测,如堆内存分配,有时会出现 Debug 有错但 Release 正常的现象。应当指出的是,如果 Debug 有错,即使 Release 正常,程序肯定是有 Bug 的,只不过可能是 Release 版的某次运行没有表现出来而已。 
2. 优化:这是造成错误的主要原因,因为关闭优化时源程序基本上是直接翻译的,而打开优化后编译器会作出一系列假设。这类错误主要有以下几种: 
(1) 帧指针(Frame Pointer)省略(简称 FPO ):在函数调用过程中,所有调用信息(返回地址、参数)以及自动变量都是放在栈中的。若函数的声明与实现不同(参数、返回值、调用方式),就会产生错误 ————但 Debug 方式下,栈的访问通过 EBP 寄存器保存的地址实现,如果没有发生数组越界之类的错误(或是越界“不多”),函数通常能正常执行;Release 方式下,优化会省略 EBP 栈基址指针,这样通过一个全局指针访问栈就会造成返回地址错误是程序崩溃。C++ 的强类型特性能检查出大多数这样的错误,但如果用了强制类型转换,就不行了。你可以在 Release 版本中强制加入 /Oy- 编译选项来关掉帧指针省略,以确定是否此类错误。此类错误通常有: 
● MFC 消息响应函数书写错误。正确的应为 
afx_msg LRESULT OnMessageOwn(WPARAM wparam, LPARAM lparam); 
ON_MESSAGE 宏包含强制类型转换。防止这种错误的方法之一是重定义 ON_MESSAGE 宏,把下列代码加到 stdafx.h 中(在#include "afxwin.h"之后),函数原形错误时编译会报错 
#undef ON_MESSAGE 
#define ON_MESSAGE(message, memberFxn) \ 
{ message, 0, 0, 0, AfxSig_lwl, \ 
(AFX_PMSG)(AFX_PMSGW)(static_cast< LRESULT (AFX_MSG_CALL \ 
CWnd::*)(WPARAM, LPARAM) > (&memberFxn) }, 
(2) volatile 型变量:volatile 告诉编译器该变量可能被程序之外的未知方式修改(如系统、其他进程和线程)。优化程序为了使程序性能提高,常把一些变量放在寄存器中(类似于 register 关键字),而其他进程只能对该变量所在的内存进行修改,而寄存器中的值没变。如果你的程序是多线程的,或者你发现某个变量的值与预期的不符而你确信已正确 的设置了,则很可能遇到这样的问题。这种错误有时会表现为程序在最快优化出错而最小优化正常。把你认为可疑的变量加上 volatile 试试。 
(3) 变量优化:优化程序会根据变量的使用情况优化变量。例如,函数中有一个未被使用的变量,在 Debug 版中它有可能掩盖一个数组越界,而在 Release 版中,这个变量很可能被优化调,此时数组越界会破坏栈中有用的数据。当然,实际的情况会比这复杂得多。与此有关的错误有: 
● 非法访问,包括数组越界、指针错误等。例如 
void fn(void) 
int i; 
i = 1; 
int a[4]; 
int j; 
j = 1; 
a[-1] = 1;//当然错误不会这么明显,例如下标是变量 
a[4] = 1; 
j 虽然在数组越界时已出了作用域,但其空间并未收回,因而 i 和 j 就会掩盖越界。而 Release 版由于 i、j 并未其很大作用可能会被优化掉,从而使栈被破坏。 
3. _DEBUG 与 NDEBUG :当定义了 _DEBUG 时,assert() 函数会被编译,而 NDEBUG 时不被编译。除此之外,VC++中还有一系列断言宏。这包括: 
ANSI C 断言 void assert(int expression ); 
C Runtime Lib 断言 _ASSERT( booleanExpression ); 
_ASSERTE( booleanExpression ); 
MFC 断言 ASSERT( booleanExpression ); 
VERIFY( booleanExpression ); 
ASSERT_VALID( pObject ); 
ASSERT_KINDOF( classname, pobject ); 
ATL 断言 ATLASSERT( booleanExpression ); 
此外,TRACE() 宏的编译也受 _DEBUG 控制。 
所有这些断言都只在 Debug版中才被编译,而在 Release 版中被忽略。唯一的例外是 VERIFY() 。事实上,这些宏都是调用了 assert() 函数,只不过附加了一些与库有关的调试代码。如果你在这些宏中加入了任何程序代码,而不只是布尔表达式(例如赋值、能改变变量值的函数调用 等),那么 Release 版都不会执行这些操作,从而造成错误。初学者很容易犯这类错误,查找的方法也很简单,因为这些宏都已在上面列出,只要利用 VC++ 的 Find in Files 功能在工程所有文件中找到用这些宏的地方再一一检查即可。另外,有些高手可能还会加入 #ifdef _DEBUG 之类的条件编译,也要注意一下。 
顺便值得一提的是 VERIFY() 宏,这个宏允许你将程序代码放在布尔表达式里。这个宏通常用来检查 Windows API 的返回值。有些人可能为这个原因而滥用 VERIFY() ,事实上这是危险的,因为 VERIFY() 违反了断言的思想,不能使程序代码和调试代码完全分离,最终可能会带来很多麻烦。因此,专家们建议尽量少用这个宏。 
4. /GZ 选项:这个选项会做以下这些事 
(1) 初始化内存和变量。包括用 0xCC 初始化所有自动变量,0xCD ( Cleared Data ) 初始化堆中分配的内存(即动态分配的内存,例如 new ),0xDD ( Dead Data ) 填充已被释放的堆内存(例如 delete ),0xFD( deFencde Data ) 初始化受保护的内存(debug 版在动态分配内存的前后加入保护内存以防止越界访问),其中括号中的词是微软建议的助记词。这样做的好处是这些值都很大,作为指针是不可能的(而且 32 位系统中指针很少是奇数值,在有些系统中奇数的指针会产生运行时错误),作为数值也很少遇到,而且这些值也很容易辨认,因此这很有利于在 Debug 版中发现 Release 版才会遇到的错误。要特别注意的是,很多人认为编译器会用 0 来初始化变量,这是错误的(而且这样很不利于查找错误)。 
(2) 通过函数指针调用函数时,会通过检查栈指针验证函数调用的匹配性。(防止原形不匹配) 
(3) 函数返回前检查栈指针,确认未被修改。(防止越界访问和原形不匹配,与第二项合在一起可大致模拟帧指针省略 FPO ) 
通常 /GZ 选项会造成 Debug 版出错而 Release 版正常的现象,因为 Release 版中未初始化的变量是随机的,这有可能使指针指向一个有效地址而掩盖了非法访问。 
除此之外,/Gm /GF 等选项造成错误的情况比较少,而且他们的效果显而易见,比较容易发现。 
-------------------------------------------------------------- 
Release是发行版本,比Debug版本有一些优化,文件比Debug文件小 
Debug是调试版本,包括的程序信息更多 
Release方法: 
build->batch build->build就OK. 
----------------------------------------------------- 
一、"Debug是调试版本,包括的程序信息更多" 
补充:只有DEBUG版的程序才能设置断点、单步执行、使用TRACE/ASSERT等调试输出语句。REALEASE不包含任何调试信息,所以体积小、运行速度快。 
二、一般发布release的方法除了hzh_shat(水) 所说的之外,还可以project->Set Active Config,选中release版本。此后,按F5或F7编译所得的结果就是release版本。
http://hi.baidu.com/msingle/item/0553df1549ea983cb931808d

debug和release的区别相关推荐

  1. Visual Studio Debug和Release的区别及obj的作用

    一.Debug和Release的区别 1.Debug:调试版本,包含调试信息,所以容量比Release大很多,并且不进行任何优化(优化会使调试复杂化,因为源代码和生成的指令间关系会更复杂),便于程序员 ...

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

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

  3. 关于VS项目平台的x86,x64,Any CPU以及Debug和Release的区别

    相信对于很多刚接触打包程序的同志来说,关于x86,x64,Any CPU这三个项目平台,以及解决方案配置Debug和Release有什么区别?这个问题一定有许多的困惑,甚至不乏一些已经工作了很久的老程 ...

  4. Debug和release版本区别 原码反码补码的转换及存储

    #define _CRT_SECURE_NO_WARNINGS 1  //Debug和release版本区别(VS2019版) //例子 #include<stdio.h> //int m ...

  5. 深入了解Debug和Release的区别

    原文地址:https://blog.csdn.net/sky___ice/article/details/8993885 一: Bin 目录用来存放编译的结果,bin是二进制binrary的英文缩写, ...

  6. 关于bin和obj文件夹。debug 和release的区别(转)

    关于bin和obj文件夹. 楼主hcaihao(影子男孩)2002-05-29 20:04:24 在 .NET技术 / C# 提问 VS.Net会生成bin和obj文件夹以及它们下面的Debug和Re ...

  7. Visual Studio中Debug和Release的区别

    在Visual Studio中,生成应用程序的时候有2种模式:Debug和Release.两者之间如何取舍呢? 假设有这么简单的一段代码,在主程序中调用方法M1,M1方法调用M2方法,M2方法调用M3 ...

  8. 切身体会,debug与release的区别

    不知道大家用vs打包的时候会不会特意改为release版本后打包.     我最近改了一个程序,打包的时候没注意,用debug打的包,结果现场反馈说对图像进行处理的时候比上一个版本的程序慢一些.我就感 ...

  9. debug 和release 的区别

    http://blog.csdn.net/h_wlyfw/article/details/26688677 转载于:https://www.cnblogs.com/pengkunfan/p/40441 ...

最新文章

  1. FreeLibraryAndExitThread DLL中线程的安全退出
  2. 计算机视觉应用的简称,计算机视觉应用之图像检索任务简单介绍
  3. 基于对象的JavaScript编程
  4. 我们的java项目,要不要废弃switch
  5. js 页面载入时的执行顺序
  6. 是做生意还是做事业,这是一个问题。
  7. (libgdx学习)InputProcessor InputMultiplexer
  8. 2020中国联通软件研究院秋招笔试编程题
  9. 2022年最新京东滑块验证码破解思路(算法过验)
  10. uygurqa输入法android,uygurqa键盘输入法
  11. excel两个表格数据合并
  12. java实现微信公众号官方支付功能
  13. 【基于python的量化策略回测框架搭建】策略表现衡量指标模块
  14. 系统错误:蓝屏提示IRQL-NOT-LESS-OR EQUAL
  15. 基于opencv第三方视觉库,通过内网IP调用手机摄像头,实现人脸识别与图形监测
  16. python输入姓名_在Python中解析人的名字和姓氏
  17. FOC——2.RC吸收电路笔记
  18. JAVA实现FTP文件传输
  19. 数据嗨客 | 第4期:逻辑回归
  20. comm.PSKModulator函数详解

热门文章

  1. Albert launcher安装与使用
  2. 设计几个简单的汇编函数
  3. 苏宁 11.11:仓库内多 AGV 协作的全局路径规划算法研究
  4. iOS之 开发常用到的宏定义
  5. H3C 帧中继初级配置(二)
  6. 随便唠叨下 最近的事情
  7. EntitySpaces2009的开发文档地址
  8. 关注BLUEBEE的浏览器发展
  9. 进程间内存共享问题[转]
  10. Linux系统特点介绍集合