VC下Debug和Release区别,第1张

VC下Debug和Release区别,第2张

最近在写代码的过程中,发现在Debug下运行正常,但是在Release下就会出现问题,让我百思不得其解。但是无法在Release下调试,只好用printf一步步定位问题,结果发现给定数组未初始化,导致后续处理异常。我在网上找了一些资料,列出来总结成备忘录~
1。Debug和Release的区别
Debug通常称为调试版本,它包含调试信息,没有任何优化,方便程序员调试程序。Release被称为release version,它往往会进行优化,使程序在代码规模和运行速度上变得很好,让用户可以很好地使用它。
调试和发布的真正区别在于一组编译选项。
Debug version
参数含义
/MDd /MLd或/MTd使用调试运行时库
/Od关闭优化开关
/D "_DEBUG "相当于#define _DEBUG,打开编译和调试代码开关(主要针对assert函数)
/ZI
创建编辑并继续数据库,这样如果在调试过程中修改了源代码,就不必重新编译
GZ来


发布版本参数的含义
/MD /ML或/MT使用发布版本的运行时库
/O1或/O2优化开关使程序最小或最快
/D "NDEBUG "关闭条件编译调试代码开关(即不编译assert函数)
/


调试和发布之间没有本质的界限。它们只是一组编译选项,编译器只是按照预定的选项来动作。

相关经历:转自http://dev.csdn.net/article/17/17068.shtm
1。变量。
众所周知,debug和release在初始化变量时做的是不同的事情。debug把每个字节位都分配给0xcc(注1),而release的分配几乎是随机的(我觉得是直接从内存分配的,没有初始化)。这就明确了,如果你的程序中有一个变量在没有初始化的情况下被引用,那么很有可能会出现异常:作为控制变量使用,会导致进程导向不一致;被用作数组下标会使程序崩溃;更有可能是其他变量不准确,造成其他误差。所以,在变量声明后立即初始化一个默认值是最简单有效的方法,否则项目太大你就无处可寻了。在调试模式下,有些代码错误可能会被忽略和检测不到。比如在调试模式下数组越界了,大部分不会出错,在release中就暴露出来了。这个比较难找:(最好多注意一下自己
呵呵,这就是我出的问题~ ~
2。自定义消息的消息参数。
MFC为我们提供了很好的消息机制,并添加了自定义消息。好处就不用我多说了。调试和发布有问题吗?答案是肯定的。在自定义消息的函数体声明时,经常会看到这样的写法:afx _ msg LRESULT OnMessageOwn();一般来说,在Debug中不会有问题,但是当你在Release下,使用多线程或进程间消息传递时,会导致无效句柄等错误。造成这个错误的直接原因是没有添加消息体的参数,即应该写成:afx _ msglresult onmessageown(wparam wparam,lparam lparam);(注2)
3。在发布模式下没有错误,但在调试模式下报告了一个错误。
这种情况大多是由于代码编写不正确造成的。查看MFC源代码,可以发现很多ASSERT语句(断言)。这个宏只在调试模式下有效,所以很明显发布版本是忽略错误而不是没有错误,这可能有很大的隐患。因为是调试模式,所以仔细调试检查自己的代码比较方便,就不多说了。
4。断言、验证、跟踪..........调试宏
这种情况很好解释。例如,请在VC下输入ASSERT并选择按F12跳转到宏定义的地方。这里可以发现Debug中的ASSERT会执行AfxAssertFailedLine,而Release下的宏定义是“#define ASSERT(f) ((void)0)”。因此,注意不要在这些调试宏语句中使用i++等程序相关变量编写语句。VERIFY是个例外,“#define VERIFY(f) ((void)(f))”,也就是执行,所以这里的角色就不追究了。有兴趣可以自己研究一下:)。

总结:
Debug不同于Release的问题往往在你第一次写代码的时候就出现了,99%都是因为你的代码编写错误造成的,所以不要总说系统问题或者编译器问题,试着自己找原因。以前也经常遇到这种情况,经历了一次又一次的教训才开始重视。现在我写的代码已经很久没有遇到这种问题了。以下是一些需要避免的方面。即使没有这个问题,也要注意:
1。注意变量的初始化,尤其是指针变量和数组变量(大的情况下另作考虑)。
2。自定义消息和其他语句的标准编写。使用调试宏后,注释掉
。4.尝试使用try-catch(...)
5。尽量使用模块,这样不仅表达清晰而且便于调试。
注1:
调试版本初始化为0xcc是因为0xcc是x86下的int 3单步中断指令,这样程序如果跑偏遇到0xcc就会停止,这和单片机编程中在无用代码空之间填充jmp 0000语句是一样的。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » VC下Debug和Release区别

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情