【转】程序debug正常release错误
来源:互联网 发布:java通用版手机qq 编辑:程序博客网 时间:2024/05/19 19:14
原文:http://hi.baidu.com/leggle/blog/item/ec0c2e5400c3ed5dd10906a7.html
呵呵,Iris来了!由于最近所做项目接近尾声,想在release下运行却发现遇此问题,遂在网上搜寻,摘录如下:
VC编写程序在debug下正常,在release下错误
可能存在的原因:
1、内存分配问题
(1)变量初始化
Release对程序的要求较Debug严格,应该对所有的变量(特别是指针和BOOL型)都先初始化再使用。
(2)数据溢出的问题
如:程序段 char buffer[4]; int num; strcpy(buffer,”abcd”);
在debug 版中buffer的NULL覆盖了num的高位,但是除非num >16M,什么问题也没有。但是在release版中, num可能被放在寄存器中,这样NULL就覆盖了buffer下面的空间,可能就是函数的返回地址,这将导致ACCESS ERROR。
(3)内存分配方式不同
如果你在DEBUG版中申请 ele 为 6*sizeof(DWORD)=24bytes,实际上分配给你的是32bytes(debug版以32bytes为单位分配),而在release版,分配给你的就是24bytes(release版以8bytes为单位),所以在debug版中如果你写ele[6],可能不会有什么问题,而在release版中,就有ACCESS VIOLATE
2、用户自定义消息应该按照定义的方式去使用
对于用户自定义消息: #define WM_USERMESSAGENAME WM_USER+1
ON_MESSAGE定义: ON_MESSAGE(WM_USERMESSAGENAME, OnUserMessageName), 该宏需要两个参数,如果消息响应函数并没有参数,编译器在压栈出栈时就会出错,而DEBUG版运行时编译器会自动加一些测试代码,所以不会造成堆栈的破坏。
解决办法:1)把ON_MESSAGE 替换成ON_MESSAGE_VOID (头文件<AFXPRIV.H>),该宏不需要参数
2)修改消息响应函数: afx_msg void OnUserMessageName(WPARAM wparam, LPARAM lparam) //一定要加参数,不管用不用得到
3、ASSERT和VERIFY
ASSERT在release版本中不会被编译,若在ASSERT中有空间分配等,就会带来错误。改为VERIFY即可。
4、内存分配
保证数据创建和清除的统一性:如果一个DLL提供一个能够创建数据的函数,那么这个DLL同时应该提供一个函数销毁这些数据。数据的创建和清除应该在同一个层次上。
5、DLL的灾难
如果你的程序使用你自己的DLL时请注意:
1)不能将debug和release版的DLL混合在一起使用。debug都是debug版,release版都是release版。
2)千万不要以为静态连接库会解决问题,那只会使情况更糟糕。
6、将Project Settings中 C++/C 项目下优化选项改为 Disable(Debug)
编译器的优化可能导致许多意想不到的错误。
参考:http://www.cygnus-software.com/papers/release_debugging.html
另附zz:
(1) 帧指针(Frame Pointer)省略(简称 FPO ):在函数调用过程中,所有调用信息(返回地址、参数)以及自动变量都是放在栈中的。若函数的声明与实现不同(参数、返回值、调用方式),就会产生错误 ————但 Debug 方式下,栈的访问通过 EBP 寄存器保存的地址实现,如果没有发生数组越界之类的错误(或是越界“不多”),函数通常能正常执行;Release 方式下,优化会省略 EBP 栈基址指针,这样通过一个全局指针访问栈就会造成返回地址错误是程序崩溃。C++ 的强类型特性能检查出大多数这样的错误,但如果用了强制类型转换,就不行了。你可以在 Release 版本中强制加入 /Oy- 编译选项来关掉帧指针省略,以确定是否此类错误。
(2) volatile 型变量:volatile 告诉编译器该变量可能被程序之外的未知方式修改(如系统、其他进程和线程)。优化程序为了使程序性能提高,常把一些变量放在寄存器中(类似于 register 关键字),而其他进程只能对该变量所在的内存进行修改,而寄存器中的值没变。如果你的程序是多线程的,或者你发现某个变量的值与预期的不符而你确信已正确 的设置了,则很可能遇到这样的问题。这种错误有时会表现为程序在最快优化出错而最小优化正常。把你认为可疑的变量加上 volatile 试试。
0
上一篇:【转】C++ ZLib压缩与解压缩
下一篇:【转】Visual Studio中的debug和release版本的区别
相关热门文章
- 我的第一个python程序之续集...
- 一款已上市MMO手游地图同步方...
- Error:未在本地计算机上注册“...
- 我的第一个python程序
- Win7配置FTP服务
- test123
- 编写安全代码——小心有符号数...
- 使用openssl api进行加密解密...
- 一段自己打印自己的c程序...
- sql relay的c++接口
- linux dhcp peizhi roc
- 关于Unix文件的软链接
- 求教这个命令什么意思,我是新...
- sed -e "/grep/d" 是什么意思...
- 谁能够帮我解决LINUX 2.6 10...
给主人留下些什么吧!~~
评论热议
0 0
- 【转】程序debug正常release错误
- 【转】程序debug正常release错误
- debug正常, Release 出现错误
- vc中debug版程序正常但release版错误
- Debug正常Release下程序崩溃问题
- VC编写程序在debug下正常,在release下错误
- VC编写程序在debug下正常,在release下错误
- VC编写程序在debug下正常,在release下错误
- debug和release调试正常,单独执行程序时报Runtime Error! 的错误原因之一
- debug版程序运行正常,release版程序运行出错
- Debug正常 而Release模式错误问题调试(转载)
- DEBUG后可以正常运行,RELEASE后出现异常错误
- Debug正常 而Release模式错误问题调试(转载
- MFC+OpenCV Debug正常Release模式下内存错误
- LIBCMT.lib 链接错误,DEBUG正常,release编译不过
- vc中debug版程序正常但release版崩溃
- vc中debug版程序正常但release版崩溃
- vc中debug版程序正常但release版崩溃
- Android中webview加载网络资源
- 【转】MySQL忘记root密码
- 【转】每个程序员都必须遵守的编程原则
- 【转】Log4j 配置最全说明
- 【转】C++ ZLib压缩与解压缩
- 【转】程序debug正常release错误
- 运放的参数和选择
- data:image/png;base64
- 【转】C++ Vector 使用心得
- 【转】select,iocp,epoll,kqueue及各种I/O复用机制
- UI性能分析工具Systrace
- 【转】关于Socket和IOCP的一些值得注意的地方
- 【转】通过程序来配置log4j,替代log4j.properties
- 【WC模拟1.23】Random
原创粉丝点击
热门IT博客
热门问题
老师的惩罚
人脸识别
我在镇武司摸鱼那些年
重生之率土为王
我在大康的咸鱼生活
盘龙之生命进化
天生仙种
凡人之先天五行
春回大明朝
姑娘不必设防,我是瞎子
鼻炎饮食
鼻炎滴液
鼻炎食疗
鼻炎的危害
鼻炎的原因
鼻炎原因
鼻炎头疼
幼儿鼻炎
鼻炎滴鼻液
鼻炎严重性
鼻炎检查
鼻炎忌口
鼻炎图片
鼻炎舒
姜氏鼻炎膏
鼻炎传染吗
鼻炎的种类
风寒性鼻炎
鼻炎特征
鼻炎打针
咽炎鼻炎
小孩子鼻炎
鼻炎灵片
鼻炎丸
鼻炎膏
干酪性鼻炎
中药鼻炎
婴儿鼻炎
传染性鼻炎
鼻炎吃什么
变异性鼻炎
长期鼻炎
鼻炎穿刺
轻微鼻炎
鼻炎患者
鼻炎传染不
扈氏鼻炎膏
鼻炎咋办
鼻炎用药
古方鼻炎通
干燥鼻炎