智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 1850|回复: 7
打印 上一主题 下一主题

[讨论] debug&Release模式区别,

[复制链接]

48

主题

323

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2669
威望
1377
贡献
668
兑换币
240
注册时间
2012-3-31
在线时间
312 小时
跳转到指定楼层
1#
发表于 2013-6-25 20:39:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
debug&Release模式区别,debug将程序放在RAM中,Release放在Flash中,为什么debug模式下,断电后程序还可以跑,还有我相同的程序放在往单片机中下载是,debug模式下,2401收数据正常,Release模式出现收不到数据,为什么,而且Release模式设不了断点,请懂的大神们给个意见吧,,

53

主题

2469

帖子

0

精华

跨届大侠

狙击手

Rank: 10Rank: 10Rank: 10

积分
11290

优秀会员奖章活跃会员奖章论坛元老奖章在线王奖章论坛骨干奖章资源大师奖章

威望
4701
贡献
3671
兑换币
2368
注册时间
2012-3-12
在线时间
1459 小时
2#
发表于 2013-6-25 22:06:22 | 只看该作者
本帖最后由 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()的函数,编译能够通过,但是调用一次后,堆栈指针发生了偏移。然后就会出错了。

知道的就这么多,其它的还得楼主自己百度
回复 支持 反对

使用道具 举报

48

主题

323

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2669
威望
1377
贡献
668
兑换币
240
注册时间
2012-3-31
在线时间
312 小时
3#
 楼主| 发表于 2013-6-26 08:14:01 | 只看该作者
sdlibin007@qq.c 发表于 2013-6-25 22:06
关于Debug&Release区别
1. 变量。
  debug跟release在初始化变量时所做的操作是不同的,debug是将每个字节 ...

很详细!但不太懂啊
回复 支持 反对

使用道具 举报

22

主题

1613

帖子

1

精华

跨届大侠

Rank: 10Rank: 10Rank: 10

积分
6784
QQ
威望
2910
贡献
1540
兑换币
1579
注册时间
2012-3-17
在线时间
1167 小时
4#
发表于 2013-6-26 10:00:00 | 只看该作者
战怺竝! 发表于 2013-6-26 08:14
很详细!但不太懂啊

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

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

回复 支持 反对

使用道具 举报

48

主题

323

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2669
威望
1377
贡献
668
兑换币
240
注册时间
2012-3-31
在线时间
312 小时
5#
 楼主| 发表于 2013-6-26 10:03:14 | 只看该作者
野火 发表于 2013-6-26 10:00
简单的说,是两个工程选项,让你可以设置不同的配置方案
debug 就是调试板的,可能进行安全检测,生成调 ...

那我两中调试方法编译都没问题,但执行结果不同,Release模式能设置断点吗,
回复 支持 反对

使用道具 举报

22

主题

1613

帖子

1

精华

跨届大侠

Rank: 10Rank: 10Rank: 10

积分
6784
QQ
威望
2910
贡献
1540
兑换币
1579
注册时间
2012-3-17
在线时间
1167 小时
6#
发表于 2013-6-26 10:10:30 | 只看该作者
战怺竝! 发表于 2013-6-26 10:03
那我两中调试方法编译都没问题,但执行结果不同,Release模式能设置断点吗,

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

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

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

回复 支持 反对

使用道具 举报

48

主题

323

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2669
威望
1377
贡献
668
兑换币
240
注册时间
2012-3-31
在线时间
312 小时
7#
 楼主| 发表于 2013-6-26 10:18:43 | 只看该作者
野火 发表于 2013-6-26 10:10
两种的编译选择不同,结果不同,正常啊!!

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

谢谢,火哥,我就是用2401问题,我发现用Debug可以通信,但Release模式就不行,
回复 支持 反对

使用道具 举报

53

主题

2469

帖子

0

精华

跨届大侠

狙击手

Rank: 10Rank: 10Rank: 10

积分
11290

优秀会员奖章活跃会员奖章论坛元老奖章在线王奖章论坛骨干奖章资源大师奖章

威望
4701
贡献
3671
兑换币
2368
注册时间
2012-3-12
在线时间
1459 小时
8#
发表于 2013-6-27 14:28:57 | 只看该作者
战怺竝! 发表于 2013-6-26 08:14
很详细!但不太懂啊

呵呵,似懂非懂就行,用多了就懂了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-11-7 23:32 , Processed in 0.048165 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表