首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > C/C++ > vc中debug版程序正常但release版崩溃
【标  题】:vc中debug版程序正常但release版崩溃
【关键字】:vc,debug,release
【来  源】:http://blog.csdn.net/keaiser/archive/2007/04/12/1562012.aspx

vc中debug版程序正常但release版崩溃

I.内存分配问题
1.变量未初始化。
    为debug中会自动给变量初始化found=FALSE,而在release版中则不会。所以尽可能的给变量、类或结构初始化。
2.数据溢出的问题
        如:char buffer[10];
             int counter;
       lstrcpy(buffer, "abcdefghik");
    在debug版中buffer的NULL覆盖了counter的高位,但是除非counter>16M,什么问题也没有。但是在release版中,counter可能被放在寄存器中,这样NULL就覆盖了buffer下面的空间,可能就是函数的返回地址,这将导致ACCESS ERROR。
3.DEBUG版和RELEASE版的内存分配方式是不同的 。
    如果你在DEBUG版中申请ele 为 6*sizeof(DWORD)=24bytes,实际上分配给你的是32bytes(debug版以32bytes为单位分配), 而在release版,分配给你的就是24bytes(release版以8bytes为单位),所以在debug版中如果你写ele[6],可能不会有什么问题,而在release版中,就有ACCESS VIOLATE。
II.ASSERT和VERIFY
1.ASSERT在Release版本中是不会被编译的。    
    假如你在这些语句中加了程序中必须要有的代码,比如:
        ASSERT(pNewObj = new CMyClass);
        pNewObj->MyFunction();
    这种时候Release版本中的pNewObj不会分配到空间所以执行到下一个语句的时候程序会报该程序执行了非法操作的错误。这时可以用VERIFY       
III.参数问题:
    自定义消息的处理函数,必须定义如下:
        afx_msg LRESULT OnMyMessage(WPARAM, LPARAM);
    返回值必须是HRESULT型,否则Debug会过,而Release出错 
IV.  内存分配
    保证数据创建和清除的统一性:如果一个DLL提供一个能够创建数据的函数,那么这个DLL同时应该提供一个函数销毁这些数据。数据的创建和清除应该在同一个层次上。
V.DLL的灾难
    人们将不同版本DLL混合造成的不一致性形象的称为 “动态连接库的地狱“(DLL Hell)如果你的程序使用你自己的DLL时请注意:
1.不能将debug和release版的DLL混合在一起使用。
    debug都是debug版,release版都是release版。解决办法是将debug和release的程序分别放在主程序的debug和release目录下
2.千万不要以为静态连接库会解决问题,那只会使情况更糟糕
VI.RELEASE板中的调试 :
1.将ASSERT() 改为 VERIFY() 。
    找出定义在"#ifdef _DEBUG"中的代码,如果在RELEASE版本中需要这些代码请将他们移到定义外。查找TRACE(...)中代码,因为这些代码在RELEASE中也不被编译。 请认真检查那些在RELEASE中需要的代码是否并没有被编译。
2.变量的初始化所带来的不同。
    在不同的系统,或是在DEBUG/RELEASE版本间都存在这样的差异,所以请对变量进行初始化。
3.是否在编译时已经有了警告?
    请将警告级别设置为3或4,然后保证在编译时没有警告出现.
VII.将Project Settings" 中 "C++/C " 项目下优化选项改为Disbale(Debug)。
    编译器的优化可能导致许多意想不到的错误,请参考http://www.pgh.net/~newcomer/debug_release.htm
1.此外对RELEASE版本的软件也可以进行调试
    请做如下改动:
        在"Project Settings" 中 "C++/C " 项目下设置 "category" 为 "General" 并且将"Debug Info"设置为 "Program Database"。
        在"Link"项目下选中"Generate Debug Info"检查框。
        "Rebuild All"
    如此做法会产生的一些限制:
    无法获得在MFC DLL中的变量的值。必须对该软件所使用的所有DLL工程都进行改动
原始套接字(C/S代码):【上一篇】
使用对象管理资源:【下一篇】
【相关文章】
  • VC技巧
  • VC编译选项
  • VC开发小技巧20个
  • EVC4.0安装说明,开发ppc2003
  • Platform Manager cannot create the communication streams needed by the debugger.
  • symbian vc一些开发问题问答
  • VC++实现GPS全球定位系统定位数据的提取
  • vc++ for symbian 开发环境配置 经验总结
  • 发现一个EVC编译器对自增算符处理时的隐患
  • 调试程序DEBUG命令说明
  • 【随机文章】
  • Perl DBI 基础
  • 文件系统控件方案
  • ctfmon - ctfmon.exe - 进程信息
  • Crystal Reports for Eclipse(2)
  • 加固你的MySQL
  • tsl脚本命令(转贴)
  • 海南订房-海南订房预订
  • 我一朋友开发出来的3D游戏引擎--Jdi
  • 很久没有写blog了.
  • 安装MS SQL Server2000“以前的某个程序安装已在安装计算机上创建挂起的文件操作”的解决办法
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.