工作中,经常会出现软件包发布版之后,会报一些很怪异的现象,在debug版没有什么问题,一到release版上面,有些功能点就会出现报错的现象;通过几次的检查 Debug与Release不同的问题在刚开始编写代码时会经常发生,
下面是几个避免的方面,即使没有这种问题也应注意一下:
1. 注意变量的初始化,尤其是指针变量,数组变量的初始化。thing * search(thing * something) BOOL found; if(found) return whatever[i]; else return NULL;
在debug下运行完美,而在release中却不行,因为debug中会自动给变量初始化found=FALSE,而在release版中则不会。所以尽可能的给变量、类或结构 初始化
变量如果未初始化, debug下面将每个字节都赋值为0Xcc,而release下是随机的.如果你的变量没有初始化被引用就可能出现异常,所以解决最好的办法就是声名变量是马上初始化,否则后期项目太大,在release下面暴露出来就很难找(建议定义去编译Release去测试,不要最后打包测试再编译,有问题还不急死人!!!
数据溢出的问题
char buffer[10]; int counter; lstrcpy(buffer, "abcdefghik");
在debug版中buffer的NULL覆盖了counter的高位,但是除非counter>16M,什么问题也没有。但是在release版中,counter可能被放在寄存器中,这样NULL就覆盖了buffer下面的空间,可能就是函数的返回地址,这将导致ACCESS ERROR
2. 自定义消息及其他声明的标准写法
MFC为我们提供了很好的消息机制,增加了自定义消息,但是这种自定义消息也存在Release和Debug的区别.
例如你定义了一个这样的消息响应函数:
afx_msg LRESULT OnMessageOwn();
在Debug下一般是没有任何问题的,但是在Release下且多线程或者进程的可能导致句柄无效的错误,原因就是消息体缺少参数,正确应该是:
afx_msg LRESULT OnMessageOwn(WPARAM wparam, LPARAM lparam);
3. 使用调试宏时使用后最好注释掉
ASSERT VERIFY TRACE....调试宏
4. 尽量使用try - catch(...)
5. 尽量使用模块,不但表达清楚而且方便调试。
为什么要区分debug和release版本呢?它们面向的目标不同的而进行区分的。debug通常称为调试版本,通过一系列编译选项的配合,编译的结果通常包含调试信息,而且不做任何优化,以为开发人员提供强大的应用程序调试能力。而release通常称为发布版本,是为用户使用的,一般客户不允许在发布版本上进行调试。所以不保存调试信息,它进行了各种优化,以期达到代码最小和速度最优
VC中release与debug的区别
最新推荐文章于 2023-02-13 16:02:11 发布