原文: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 试试。

【转】程序debug正常release错误相关推荐

  1. 如何判断是linux/windows库,module或程序debug还是release(转)

    linux: readelf -S xxx.a |grep "\.debug*" 如果有输出, 是debug, 没有是release      windows: dumpbin / ...

  2. Debug 和 Release 编译方式

    Debug 和 Release 编译方式的区别本文主要包含如下内容: 1. Debug 和 Release 编译方式的本质区别 2. 哪些情况下 Release 版会出错 3. 怎样"调试& ...

  3. 关于如何判断程序和类库是Debug 还是 Release 的问题

    在发布程序时不小心把一部分Debug的dll文件和一部分Release的dll文件混合发布了,最后导致整个生产环境瘫痪(内存和cpu使用量很高,同时网站访问无响应).到现在我还搞不懂为什么会这样,也许 ...

  4. 为什么我的程序debug版本运行没有问题,而release版本总是报错?

    To   楼主   ,我在另外一个类似的贴子作了回答     http://expert.csdn.net/Expert/topic/2955/2955693.xml?temp=.3361933   ...

  5. flex发布的release程序要配release的Flash Player,速度飞快!如果有一方是debug版本的,速度就降下来了,要注意!...

    flex发布的release程序要配release的Flash Player,速度飞快!如果有一方是debug版本的,速度就降下来了,要注意! 有时自已发布的release程序,感常和debug速度差 ...

  6. 细说Debug和Release区别

    VC下Debug和Release区别 最近写代码过程中,发现 Debug 下运行正常,Release 下就会出现问题,百思不得其解,而Release 下又无法进行调试,于是只能采用printf方式逐步 ...

  7. 关于Debug和Release编译方式

    问:怎么在VC6中把工程编译成release版本? 答:可以project->Set Active Config,选中release版本.此后,按F5或F7编译所得的结果就是release版本. ...

  8. 关于VS项目平台的x86,x64,Any CPU以及Debug和Release

    相信对于很多刚接触打包程序的同志来说,关于x86,x64,Any CPU这三个项目平台,以及解决方案配置Debug和Release有什么区别?这个问题一定有许多的困惑,甚至不乏一些已经工作了很久的老程 ...

  9. VS Debug和Release版本的区别

    VS Debug和Release版本的区别 1. 变量. 大家都知道,debug跟release在初始化变量时所做的操作是不同的,debug是将每个字节位都赋成0xcc(注1),而release的赋值 ...

最新文章

  1. ggplot2笔记5:通过图层构建图像
  2. 三大运营商扎堆进军“元宇宙”
  3. 如何进行I/O评估、监控、定位和优化?
  4. 【趣味分享】C#实现回味童年的24点算法游戏
  5. UnitTest in .NET(Part 1)
  6. BZOJ4589. Hard Nim
  7. 字典使用与内部实现原理
  8. java基于文件的map实现_Mybatis中返回Map的实现
  9. 信息学奥赛一本通(1124:矩阵加法)
  10. linux查看命令本身shell脚本的路径
  11. 贼好用的Java工具类库,GitHub星标10k+,你在用吗?
  12. layui怎样将响应数据展示在页面_layui-table对返回的数据进行转变显示的实例
  13. Render to Disk
  14. Elasticsearch.service failed after enable elasticsearch security features
  15. 手机之家签名工具_自签工具更新 | 手机端自签,无需电脑,支持iOS 14 !
  16. [Android]网页内图片点击查看大图/识别二维码/下载
  17. Hibernate中的sessionFactory是做什么用的?
  18. 大数据实时处理:百分点实时计算架构和算法
  19. 老鼠赛跑游戏(富人不为钱工作)
  20. 数字电路----加法器的实现

热门文章

  1. python最小公倍数 菜鸟_最小公倍数 golang + python
  2. 内存分段分页机制理解_深入理解虚拟机,JVM高级特性-自动内存管理机制
  3. 如何评价模型的好坏(一)
  4. 最全python面试题
  5. 主键primary key和唯一索引unique index
  6. wcf简单的创建和运用
  7. Andrew Ng机器学习课程7
  8. C# .Net中的类型转换
  9. Java 的 IO 流
  10. 从Zero到Hero,OpenAI重磅发布深度强化学习资源