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

在使用VC开发软件的过程中,正当要享受那种兴奋的时候突然发现:release与debug运行结果不一致,甚至出错,而release又不方便调试,真的是当头一棒啊,可是疼归疼,问题总要解决,下面将讲述一下我的几点经验,看看是不是其中之一:

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:
afc(afc) 网友提供:
debug版初始化成0xcc是因为0xcc在x86下是一条int 3单步中断指令,这样程序如果跑飞了遇到0xcc就会停下来,这和单片机编程时一般将没用的代码空间填入jmp 0000语句是一样地
注2:
不知大家有没有遇到过这种情况,具体原因我也不太清楚,是不是调用时按着默认的参数多分配了WPARAM+LPARAM的空间而破坏了应用程序的内存空间?还请高手来补充。
NightWolf 网友提供:我遇见过,好像是在函数调用的时候参数入栈的问题。因为MFC的消息使用宏写的,所以如果定义了OnMessage()的函数,编译能够通过,但是调用一次后,堆栈指针发生了偏移。然后就。。。

转载于:https://www.cnblogs.com/enterBeijingThreetimes/archive/2008/12/03/1346931.html

VC下关于debug和release的不同的讨论(收藏-转载)相关推荐

  1. BOOL 值在 debug 和 release 模式下初始化不一样!!!

    原文:http://www.cppblog.com/lai3d/archive/2009/07/08/89514.html 未初始化的bool成员变量在Debug下默认值为false,Test下默认t ...

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

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

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

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

  4. VC编写程序在debug下正常,在release下错误

    Debug 和 Release 编译方式的区别 Debug 和 Release 的真正秘密,在于一组编译选项.下面列出了分别针对二者的选项(当然除此之外还有其他一些,如/Fd /Fo,但区别并不重要, ...

  5. VC下Debug 和Release 区别【转】

    在工具栏上点右键,选择编译,将编译win32debug改为win32 Release即可.如果需要调试的话,还需要再改回来方可. 最近写代码过程中,发现 Debug 下运行正常,Release 下就会 ...

  6. 对VC++下Debug模式和Release模式的简要分析

    // // 备注:本篇文章来自 vc驿站:http://www.cctry.com/thread-254205-1-1.html // C.C++.VC++ 各种学习资源,免费教程,期待您的加入! / ...

  7. Debug下正常,而Release失败的真正原因

    本文主要包含如下内容:  1. Debug 和 Release 编译方式的本质区别  2. 哪些情况下 Release 版会出错  2. 怎样"调试" Release 版的程序  ...

  8. VC下发布的Release版程序的异常捕捉

    VC下发布的Release版程序的异常捕捉寻找Release版程发生异常退出的地方比Debug版麻烦得多.发生异常的时候windows通常会弹出一个错误对话框,点击详细信息,我们能获得出错的地址和大概 ...

  9. VC Debug与Release区别

    Debug通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序.Release称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用,我们 ...

  10. VC中debug和release版本的区别

    vc中debug和release的不同 收藏  在使用VC开发软件的过程中,正当要享受那种兴奋的时候突然发现:release与debug运行结果不一致,甚至出错,而release又不方便调试,真的是当 ...

最新文章

  1. lua学习笔记之编译、运行及错误
  2. Tomcat工作原理
  3. rectint 函数
  4. 趣学python3(15)-f-string字符串
  5. E: Some index files failed to download. They have been ignored, or old ones used instead.解决方案
  6. java从远程服务器获取PDF文件并后台打印(使用pdfFox)
  7. Pentium的指令系统(4)——串操作指令
  8. apachecommon连接mysql_使用 apache common dbcp +common pool+mysql连接无效的问题
  9. SQOOP对分隔符支持情况的验证
  10. OpenNI XnSkeletonJointOrientation 簡單分析
  11. 分享一个WIN10可用的桌面图标栅栏管理插件Fences的破解版
  12. Android开发网上的一些重要知识点[经验分享]
  13. 第八章笔记[计算机网络]
  14. PPT 不支持打开显示 webp 图片
  15. 大学生竞赛管理系统-JAVA【数据库设计、源码、开题报告】
  16. graphpad prism横坐标怎么设置不显示数值_Graphpad Prism 的 4 个隐藏技能助你轻松发表 SCI...
  17. 各种标点符号的英文怎么说
  18. 配色三部曲-创建自己的调色板
  19. 面试必问之JVM原理 1
  20. Apache Kylin的安装和使用

热门文章

  1. dva开发一个cnode网站(2)
  2. Java 11 的新特性(上)
  3. 百万级别长连接,并发测试指南
  4. 每日一模式之数据库模式
  5. 免费的数据恢复软件 恢复丢失的数据
  6. 看了扎心:39岁单身程序员入住养老院!养老院:院内平均年龄瞬间年轻了
  7. 重磅!!Redis 6.0.0 已发布,有史以来改变最大的版本
  8. 【系统架构】如何逐步去构建一个大型网站系统
  9. 数据库的架构设计与性能优化
  10. 阿里双十一技术揭秘——双十一 手淘技术用了这几招