智能车制作

标题: debug&Release模式区别, [打印本页]

作者: 战怺竝!    时间: 2013-6-25 20:39
标题: debug&Release模式区别,
debug&Release模式区别,debug将程序放在RAM中,Release放在Flash中,为什么debug模式下,断电后程序还可以跑,还有我相同的程序放在往单片机中下载是,debug模式下,2401收数据正常,Release模式出现收不到数据,为什么,而且Release模式设不了断点,请懂的大神们给个意见吧,,
作者: sdlibin007@qq.c    时间: 2013-6-25 22:06
本帖最后由 sdlibin007@qq.c 于 2013-6-25 22:09 编辑

关于Debug&Release区别
1. 变量。
  debug跟release在初始化变量时所做的操作是不同的,debug是将每个字节位都赋成 0xcc(注1),而release的赋值近似于随机。这样就明确了,如果程序中的某个变量没被初始化就 被引用,在release上就很有可能出现异常:用作控制变量将导致不可预料错误;用作数组下标将会使程序崩溃;更有可能是造成其他变量的不准确而引起其他的错误。所以在 声明变量后马上对其初始化一个默认的值是最简单有效的办法,否则项目大了你找都没地方找。

2. 自定义消息的消息参数。
  MFC为我们提供了很好的消息机制,更增加了自定义消息。也许 你会问这也存在debug跟 release的问题吗?答案是肯定的。在自定义消息的函数体声明时,时常会看到这样的写法:afx_msg LRESULT OnMessageOwn()(注2); Debug情况下一般不会有任何问题,而当你在Release下且多线程或进程间使用了消息传递时就会导致无效句柄之类的错误。导致这个错误直接原因是消 息体的参数没有添加,即应该写成:afx_msg LRESULT OnMessageOwn(WPARAM wparam, LPARAM lparam);

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))",即执行。

注1:debug版初始化成0xcc是因为0xcc在x86下是一条int 3单步中断指令,这样程序如果跑飞了遇到0xcc就会停下来,这和单片机编程时一般将没用的代码空间填入jmp 0000语句是一样地
注2:在函数调用的时候参数入栈的问题。因为MFC的消息使用宏写的,所以如果定义了OnMessage()的函数,编译能够通过,但是调用一次后,堆栈指针发生了偏移。然后就会出错了。

知道的就这么多,其它的还得楼主自己百度

作者: 战怺竝!    时间: 2013-6-26 08:14
sdlibin007@qq.c 发表于 2013-6-25 22:06
关于Debug&Release区别
1. 变量。
  debug跟release在初始化变量时所做的操作是不同的,debug是将每个字节 ...

很详细!但不太懂啊
作者: 野火    时间: 2013-6-26 10:00
战怺竝! 发表于 2013-6-26 08:14
很详细!但不太懂啊

简单的说,是两个工程选项,让你可以设置不同的配置方案
debug 就是调试板的,可能进行安全检测,生成调试信息,不开代码优化等
而Release,不生成调试信息,开优化等

至于放到RAM 或者放到 Flash ,都是可以在工程选项里设置,与 debug 和 Release 无关,看你如何配置


作者: 战怺竝!    时间: 2013-6-26 10:03
野火 发表于 2013-6-26 10:00
简单的说,是两个工程选项,让你可以设置不同的配置方案
debug 就是调试板的,可能进行安全检测,生成调 ...

那我两中调试方法编译都没问题,但执行结果不同,Release模式能设置断点吗,
作者: 野火    时间: 2013-6-26 10:10
战怺竝! 发表于 2013-6-26 10:03
那我两中调试方法编译都没问题,但执行结果不同,Release模式能设置断点吗,

两种的编译选择不同,结果不同,正常啊!!

Release 的执行效率一般比debug 的高,但有时会出现不稳定,尤其是与时序相关的(Release 可能会把延时删掉)

Release 不能设断点(不生成调试信息)


作者: 战怺竝!    时间: 2013-6-26 10:18
野火 发表于 2013-6-26 10:10
两种的编译选择不同,结果不同,正常啊!!

Release 的执行效率一般比debug 的高,但有时会出现不稳定 ...

谢谢,火哥,我就是用2401问题,我发现用Debug可以通信,但Release模式就不行,
作者: sdlibin007@qq.c    时间: 2013-6-27 14:28
战怺竝! 发表于 2013-6-26 08:14
很详细!但不太懂啊

呵呵,似懂非懂就行,用多了就懂了





欢迎光临 智能车制作 (http://dns.znczz.com/) Powered by Discuz! X3.2