欢迎来到天天文库
浏览记录
ID:9281764
大小:40.00 KB
页数:5页
时间:2018-04-26
《release和debug的不同》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、release和debug的不同Postedby:kevinlinon:四月19,2006In:VC++/C++/CComment!AdsbyGoogleA.V.F.I.ManufacturerofAirReleaseValvesForWaterandSewagewww.avfi.com.au有时候常常会遇到Debug可以跑但是Release反而不能跑了为什么呢?这实在很奥妙所以要好好了解一下这两个的差异还有所以我们常常需要在一个阶段就Release编译一次这样才不会最后手足无措Debug版本参数含义/MDd/MLd或/
2、MTd使用Debugruntimelibrary(测试版本的执行时函式库)/Od关闭最佳化开关/D“_DEBUG”相当于#define_DEBUG,打开编译测试程序代码开关(主要针对assert函数)/ZI建立Editandcontinue(编辑继续)数据库,这样在测试过程中如果修改了程序代码不需重新编译/GZ可以帮助取得内存的错误/Gm打开最小化重链接开关减少链接时间Release版本参数含义/MD/ML或/MT使用发布版本的执行时函式库/O1或/O2最佳化开关,使程序最小或最快/D“NDEBUG”关闭条件编译测试程序
3、代码开关(即不编译assert函数)/GF合并重复的字符串,并将字符串常数放到ROM中,防止被修改事实上呢Debug和Release并没有本质的界限他们只是一组编译选项的集合编译器只是按照预定的选项行动。事实上我们甚至可以修改这些选项从而得到最佳化过的测试版本或是带跟踪语法的正式版本。哪些情况下Release版会出错有了上面的介绍,我们再来逐个对照这些选项看看Release版错误是怎样产生的1、RuntimeLibrary:链接哪种执行时的函式库通常只对程序的性能产生影响。测试版本的RuntimeLibrary包含了测试
4、用的讯息,并采用了一些保护机制以帮助发现错误,所以性能上较不如Release的版本。编译器提供的RuntimeLibrary通常很稳定,不会造成Release版本错误;倒是由于Debug的RuntimeLibrary加强了对错误的检测,如Heap的内存分配,有时会出现Debug有错但Release正常的现象。这里要注意的是,如果Debug有错,即使Release正常,程序保证是有Bug的,只不过可能是Release版的某次执行没有表现出来而已。2、最佳化:这是造成错误的主要原因,因为关闭最佳化时原始程序基本上是直接翻译的
5、,而打开最佳化后编译器会作出一系列假设。这类错误主要有以下几种:1.FramePointer的省略(简称FPO):在函式的呼叫过程中,所有呼叫的讯息(回传地址、参数)以及自动变量都是放在堆栈中的。如果函式的宣告跟实作不同(参数、回传值、呼叫方式),就会产生错误,但Debug方式下,堆栈的存取透过EBP缓存器储存的地址来实现,如果没有发生数组越界之类的错误(或是越界「不多」),函式通常能正常执行;Release方式下,最佳化会省略EBP堆栈基本地址的指针,这样通过一个全域指针存取堆栈就会造成回传地址错误导致整个程序崩溃。C
6、++的强类型特性能检查出大多数这样的错误,但如果用了强制类型转换,就不行了。你可以在Release版本中强制加入/Oy-编译选项来关掉FPO,以确定是否此类错误。此类错误通常有:MFC讯息响应函式不小心写错。正确的应为:afx_msgLRESULTOnMessageOwnWPARAMwparam,LPARAMlparam);¼br/>ON_MESSAGE宏包含强制类型转换。防止这种错误的方法之一是重新定义ON_MESSAGE宏,把下列程序代码加到stdafx.h中(在#include“afxwin.h”之后),函式原形错
7、误时编译会报错。#undefON_MESSAGE#defineON_MESSAGE(message,memberFxn){message,0,0,0,AfxSig_lwl,(AFX_PMSG)(AFX_PMSGW)(static_cast(&memberFxn)},2.volatile型的变数:volatile告诉编译器该变量可能被程序之外的未知方式修改(如系统、其它process或thread)。最佳化程序为了使程序性能提高,常把一些变量放在缓存器中(类似于register关键词),而其它process只能对该变量
8、所在的内存进行修改,而缓存器中的值没变。如果你的程序是多执行绪的,或者你发现某个变量的值与预期的不符而你确定已经正确的设置了,那就很可能遇到这样的问题。这种错误有时会表现为程序在最快的最佳化时出错而最小的最佳化时正常。把你认为可疑的变量加上volatile试试。3.变数最佳化:最佳化程序会根据变量的使用情况最佳化变量
此文档下载收益归作者所有