|
本帖最后由 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()的函数,编译能够通过,但是调用一次后,堆栈指针发生了偏移。然后就会出错了。
知道的就这么多,其它的还得楼主自己百度
|
|