`
huozheleisi
  • 浏览: 1266210 次
文章分类
社区版块
存档分类
最新评论

VC下Debug 和Release 区别

 
阅读更多

VC下Debug 和Release 区别

最近写代码过程中,发现 Debug 下运行正常,Release 下就会出现问题,百思不得其解,而Release 下又无法进行调试,于是只能采用printf方式逐步定位到问题所在处,才发现原来是给定的一个数组未初始化,导致后面处理异常。网上查找了些资料,在这罗列汇总下,做为备忘~
一、Debug 和 Release 的区别
Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。
Debug 和 Release 的真正区别,在于一组编译选项。
Debug 版本
参数 含义
/MDd /MLd 或 /MTd 使用 Debug runtime library(调试版本的运行时刻函数库)
/Od 关闭优化开关
/D "_DEBUG" 相当于 #define _DEBUG,打开编译调试代码开关(主要针对assert函数)
/ZI
创建 Edit and continue(编辑继续)数据库,这样在调试过程中如果修改了源代码不需重新编译
GZ 可以帮助捕获内存错误


Release 版本 参数含义
/MD /ML 或 /MT 使用发布版本的运行时刻函数库
/O1 或 /O2 优化开关,使程序最小或最快
/D "NDEBUG" 关闭条件编译调试代码开关(即不编译assert函数)
/GF 合并重复的字符串,并将字符串常量放到只读内存,防止被修改


Debug 和 Release 并没有本质的界限,他们只是一组编译选项的集合,编译器只是按照预定的选项行动。

相关经验: 转自http://dev.csdn.net/article/17/17068.shtm
1. 变量。
大家都知道,debug跟release在初始化变量时所做的操作是不同的,debug是将每个字节位都赋成0xcc(注1),而release的赋值近似于随机(我想是直接从内存中分配的,没有初始化过)。这样就明确了,如果你的程序中的某个变量没被初始化就被引用,就很有可能出现异常:用作控制变量将导致流程导向不一致;用作数组下标将会使程序崩溃;更加可能是造成其他变量的不准确而引起其他的错误。所以在声明变量后马上对其初始化一个默认的值是最简单有效的办法,否则项目大了你找都没地方找。代码存在错误在debug方式下可能会忽略而不被察觉到,如debug方式下数组越界也大多不会出错,在release中就暴露出来了,这个找起来就比较难了:( 还是自己多加注意吧
呵呵,就是我犯的问题~~
2. 自定义消息的消息参数。
MFC为我们提供了很好的消息机制,更增加了自定义消息,好处我就不用多说了。这也存在debug跟release的问题吗?答案是肯定的。在自定义消息的函数体声明时,时常会看到这样的写法:afx_msg LRESULT OnMessageOwn(); Debug情况下一般不会有任何问题,而当你在Release下且多线程或进程间使用了消息传递时就会导致无效句柄之类的错误。导致这个错误直接原因是消息体的参数没有添加,即应该写成:afx_msg LRESULT OnMessageOwn(WPARAM wparam, LPARAM lparam); (注2)

3. release模式下不出错,但debug模式下报错。
这种情况下大多也是因为代码书写不正确引起的,查看MFC的源码,可以发现好多ASSERT的语句(断言),这个宏只是在debug模式下才有效,那么就清楚了,release版不报错是忽略了错误而不是没有错误,这可能存在很大的隐患,因为是Debug模式下,比较方便调试,好好的检查自己的代码,再此就不多说了。
4. ASSERT, VERIFY, TRACE..........调试宏
这种情况很容易解释。举个例子:请在VC下输入ASSERT然后选中按F12跳到宏定义的地方,这里你就能够发现Debug中ASSERT要执行AfxAssertFailedLine,而Release下的宏定义却为"#define ASSERT(f) ((void)0)"。所以注意在这些调试宏的语句不要用程序相关变量如i++写操作的语句。VERIFY是个例外,"#define VERIFY(f) ((void)(f))",即执行,这里的作用就不多追究了,有兴趣可自己研究:)。

总结:
Debug与Release不同的问题在刚开始编写代码时会经常发生,99%是因为你的代码书写错误而导致的,所以不要动不动就说系统问题或编译器问题,努力找找自己的原因才是根本。我从前就常常遇到这情况,经历过一次次的教训后我就开始注意了,现在我所写过的代码我已经好久没遇到这种问题了。下面是几个避免的方面,即使没有这种问题也应注意一下:
1. 注意变量的初始化,尤其是指针变量,数组变量的初始化(很大的情况下另作考虑了)。
2. 自定义消息及其他声明的标准写法
3. 使用调试宏时使用后最好注释掉
4. 尽量使用try - catch(...)
5. 尽量使用模块,不但表达清楚而且方便调试。
注1:
debug版初始化成0xcc是因为0xcc在x86下是一条int 3单步中断指令,这样程序如果跑飞了遇到0xcc就会停下来,这和单片机编程时一般将没用的代码空间填入jmp 0000语句是一样地

其实超级easy,不过问了同学后才知道 -_-!。在工具栏上点右键,选择编译,将编译win32debug改为win32 Release即可。如果需要调试的话,还需要再改回来方可。

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=365007其实超级easy,不过问了同学后才知道 -_-!。在工具栏上点右键,选择编译,将编译win32debug改为win32 Release即可。如果需要调试的话,还需要再改回来方可。

分享到:
评论

相关推荐

    VC Debug 和 Release的区别

    VC Debug 和 Release 的区别 Debug 和 Release 是 VC 编译选项中的两个重要概念,它们之间的区别主要体现在编译方式、优化选项和 Runtime Library 等方面。理解这两者的区别对 C++ 开发者来说非常重要,因为它们...

    VC下关于debug和release的不同的讨论

    在使用Microsoft Visual C++ (VC) 开发软件时,我们经常会遇到Debug和Release两种配置下程序行为不一致的情况。这是由于两者在编译、链接以及优化策略上的显著差异导致的。下面将详细讨论这些差异以及如何解决由此...

    vc的debug和release版本之区别详解

    很不错的介绍,对于编译的调试很有帮助

    VC-Debug-Release]出错的问题解决办法

    VC-Debug-Release 版本差异及调试相关问题解决办法 在调试 VC 程序时,经常出现 Release 版本或者 Debug 版本运行崩溃的问题,本文给出了多种解决方法,以帮助开发者解决这些问题。 一、内存分配问题 在 Debug 版...

    VC90_debug_release_mfc_crt.zip

    总结来说,"VC90_debug_release_mfc_crt.zip"是一个实用的工具,它解决了在不安装完整Visual Studio 2008的情况下,运行依赖VC9 CRT和MFC库的应用程序的问题。通过理解这些库的作用和用法,开发者能够更有效地进行...

    删除debug和release文件夹

    主要用于删除VC编译生成的文件夹debug和release,因为这两个文件夹下的文件太浪费空间了。 利用STL中的queue来存储文件夹名,实现非递归来查找指定的文件夹debug和release。 其实就是找到一个文件夹就加入文件夹队列...

    visual studio不显示Debug,Release的原因及解决办法

    在使用Visual Studio进行C++开发时,有时可能会遇到IDE不显示“Debug”和“Release”配置的情况,这对于软件开发过程中的调试和发布是至关重要的。本文将深入探讨这个问题的原因,并提供有效的解决办法。 首先,...

    Opencv3.4.1_Contrib+VC14_VC15+X86_X64+Debug_Release+Simple LIB

    OpenCV3.4.1的合并式函数库 包含Contrib拓展库 适用于VC14和VC15 X64和X86两种编译架构 Debug和Release两种编译模式 总共8种应用于不同编译环境的OpencCV函数库

    VC2008_MFC_CRT_DEBUG_RELEASE_amd64

    VC2008_MFC_CRT_DEBUG_RELEASE_amd64版本 BC2008的MFC运行库, CRT运行库, debug和release, amd64版本, 统一打包到一起, 多线程 DLL (/MD) 方式编译的exe 与这个包的文件放在一起, 在任何windows系统下就都可以运行了

    vc debug版本详解0812

    在软件开发领域,尤其是使用Visual C++(VC)进行编程时,debug版本与release版本之间的区别是开发者必须理解的关键概念之一。本文将深入解析VC的debug版本,探讨其特点以及它如何帮助开发者进行有效的调试。 #### ...

    PCRE8.32 VC6编译下包括debug和release版本支持UTF-8

    PCRE8.32版本,包括debug和release版本,编译通过,并且经过验证

    最新curl 动态库 -7.65.2 vc6 xp平台 下的 编译版本,含dll lib文件 debug和release双版本

    本文将详细介绍如何在VC6下编译curl 7.65.2动态库,并探讨其dll和lib文件在debug和release模式下的使用。 首先,我们关注的是编译过程。对于curl库,编译过程通常包括预处理、编译、链接等步骤。在XP环境下,由于...

    vs2008 CRT运行库,MFC运行库(Debug、Release)

    在VS2008中,CRT分为Debug和Release两个版本。Debug版本包含额外的调试信息,有助于在开发过程中定位错误;Release版本则优化了性能,适合发布给最终用户。在部署应用时,需要根据程序的构建类型选择对应的CRT库。 ...

    zlib 1.2.11 的windows x64编译版本,包含debug和release

    这个版本包含了Debug和Release构建,这对于开发者来说非常关键,因为Debug版本用于调试,而Release版本则用于优化性能和部署。 Debug版本的库通常包含额外的检查和调试信息,便于开发者在程序出错时定位问题。...

    opencv4.7.0用VS2022编译的debug和release库

    压缩包中的"opencv-4.7.0-vc17"很可能就是编译后的库文件,可能包含了不同配置(debug和release)和不同架构(如x86、x64)的文件。 最后,当其他项目需要使用这个编译好的OpenCV库时,只需将编译的库文件路径添加...

    VC2008_MFC_CRT_DEBUG_RELEASE_x86

    VC2008_MFC_CRT_DEBUG_RELEASE_amd64版本 BC2008的MFC运行库, CRT运行库, debug和release, amd64版本, 统一打包到一起, 多线程 DLL (/MD) 方式编译的exe 与这个包的文件放在一起, 在任何windows系统下就都可以...

    libcurl 使用vs2010编译的动态库和静态库(包含的debug和release版和头文件)

    四、debug和release版本的区别 - Debug版本:在调试模式下使用,包含额外的调试信息,便于查找和修复错误,但运行速度相对较慢。 - Release版本:在生产环境中使用,优化了代码,运行速度快,但不包含调试信息。 ...

    Opencv3.4.1_Contrib+VC14_VC15+X86_X64+Debug_Release+Multi LIB

    OpenCV3.4.1的分离式函数库 包含Contrib拓展库 适用于VC14和VC15 X64和X86两种编译架构 Debug和Release两种编译模式 总共8种应用于不同编译环境的OpencCV函数库

    未安装VC时运行debug版所需dll

    总之,理解和处理“未安装VC时运行debug版所需dll”的问题,关键在于理解DLL的工作原理以及Debug和Release版本的区别,同时采取适当的措施来确保程序能够正确运行。这可能是通过安装必要的运行时库,复制DLL文件,...

    vc Release版本调试

    这个标题表明了文章的主要内容是关于如何在Visual C++ (VC) 环境下对Release版本进行调试的方法和技术。通常情况下,Release版本是指已经经过充分测试并准备发布给最终用户的版本。与Debug版本相比,Release版本更加...

Global site tag (gtag.js) - Google Analytics