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

层层深入讲解VC程序中Debug版本和Released版本区别

 
阅读更多
从事C++的,肯定都会遇到Debug版本和Release版本运行结果不一致的问题,肯定也会遇到两个版本中,其中某一个版本可以运行,而另一个版本导致程序崩溃的问题。
对于初学者而言,这无比是个令人头疼的问题。因为对于这个问题,不知所措,无从下手。为了解决版本系列问题,我们应该理解Debug版本和Released版本,背后到底隐藏了什么?
对于一个问题的认知,肯定是由表及里,由浅入深,层层深入。
所以,我们首先应该明白Debug版本和Released版本的表面意义。表面的,大众的,常用的,基础的,这就说明,这块是我们必须了解掌握的。
VC程序在Debug版本运行的结果与在Released版本下运行的结果,直接的区别是:Released版本下的文件,容量小。而在Debug版本下的文件,容量大。
因为Debug版本,属于调试版本,包含了很多调试信息,所以,生成的文件,容量大。而Released版本下,属于发布版本,发布直接投入使用的,所以,生成的文件,不包含调试信息,因此,容量小。
因Debug版本包含了调试信息,所以在Debug版本下可以设置单步调试。而在Released版本,一般不可以设置单步调试。虽然,一般情况下,Released版本下,不可以设置单步调试,但是,也可以设置调试,只不过不能像Debug版本下,可以跟踪调试。因为在Released版本下,很多变量已经被优化,所以根本无法跟踪。
在Released版本下,设置调试步骤如下:(由于把VC6.0卸载,只要用文字叙述)
Project——Setting,在左上角,Setting For 选择win32Released版本,在C++标签中,Category选择General,Deug Info选择,ProgramDataBase。在link项目下选中General Debug Info检查框。然后重新全部编译。
另外,我们还有一点需要注意。若我们使用Debug发布的exe程序,在未装VC环境下,是无法运行的,提示缺少 MFC42D.DLL 等VC库。而我们一般使用Released版本静态库发布的exe程序,这样,在任何环境下都可以运行。
一般情况,选择Debug版本,IDE环境一般默认是的动态共享库。选择Released版本,IDE环境一般默认的是静态库。至于动态运行库与静态运行库的区别,在上篇博客中已经介绍。
基础的区别,我们已经介绍,那我们继续介绍,其本质的区别,是什么原因导致两个版本下产生不同的结果。
其实,Debug版本和Released版本,最本质的区别,在于一组编译选项。编译选项设置不同,最后产生的效果也是不同的。
既然是编译选项设置不同,那就可以说明,设置可以改变的,所以说呢,Debug版本与Released版本也没有太严格的区分,若设置编译选项交换,则Debug版本和Released版本则效果正好反过来。
两个版本的编译选项如下:
Debug设置:
编译选项:/Od /D "_DEBUG" /Gm /RTC1 /MDd /Fo"Debug““" /ZI
链接选项:/OUT:"D:“MyProject“logging“Debug“OptionTest.dll" /INCREMENTAL
Release设置:
编译选项:/O2 /GL /D "NDEBUG" /FD /MD /Fo"Release““" /Zi
链 接选项:/OUT:"D:“MyProject“logging“Release“OptionTest.dll" /INCREMENTAL:NO
每个选项的意义,msdn上有详细的介绍:msdn地址如下: http://msdn.microsoft.com/en-us/library/aa236703(v=vs.60).aspx
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 合并重 复的字符串,并将字符串常量放到只读内存,防止被修改
这些设置,IDE已经帮我们设置好了,为了方便我们调试,并且为了解决文章开头的问题,我们是需要了解其本质区别。
Debug版本和Released版本,为了使两个版本下,结果相同。也就是兼容两个版本,这种情况,类似于Web中的必须兼容各个浏览器。比如某个样式或某个JS在某个浏览器下不起作用。这说明了写的代码是有问题了,我们应该写大众化,而不是只针对于某个浏览器。比如getElementName在IE浏览器是可以识别的,但是在FF中不识别。
因此呢,我们VC程序中,对于Debug和Released兼容,我们应该:
1. 注意变量的初始化,尤其是指针变量,数组变量的初始化
2. 自定义消息及其他声明的标准写法
3. 使用调试宏时使用后最好注释掉
4. 尽量使用try - catch(...)
5. 尽量使用模块,不但表达清楚而且方便调试。
并且,我们在开发程序中,我们应该时常测试不同版本,就如做页面时,不断在各个浏览器中不断测试兼容性。VC程序也是如此的,这样,我们才可以尽早发现问题,尽早改正问题,尽量减少开发的成本。
一般情况下,版本不兼容,很大可能是自己程序的问题,而不要简单的归结或推在各种环境或VC库。下篇博客中,我们会根据我项目中具体的实例来讲解Debug版本可以正常运行,在Realsed版本下程序崩溃的问题。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics