Debug和Release有什么区别

0

调试版本组编调试交流。,如此它比发行版要大得多(可能性是几百K到M)。。至若DLL的支持者是不可避免的的,次要看你用的编译选择权。万一它是鉴于ATL,调试和发行物版本相象地DLL。。万一编译选择权用于应用mfc静态库,这是单独同样的人的库支持者的必要,必要支持者发行物版本。。Release 编译不调试源编码。,不思索宏mfc的调查分析,应用mfc。  Release库,十优化组合编译敷用的裁判高声吹哨,和调试 开发区正相反。,它容许调试源编码。,可解释和用于MFC的调查分析宏,应用MFC 调试库,无裁判高声吹哨优化组合。    
一、Debug  和  Release 编译方法的实质分别  
Debug 通常称为调试版本,它组编调试交流。,不做无论哪一些优化组合,顺序员调试顺序。Release  称为发行物版本,它通常是各种各样的优化组合。,在编码按大小排列和运转裁判高声吹哨上优化组合顺序,为了更合适的地应用用户。  
Debug  和  Release 真正的奥密,这是一套编译选择权。下面列出了两个选择权(自然,更稍许的选择权),如/ FD  /Fo,但清楚的的是不足道的,通常他们不克不及的使遭受  Release 版本反对的,这边没议论)  
Debug  版本:  
/MDd  /MLd  或  /MTd  应用  Debug  runtime 库(调试版本运转时职务库)  
/Od 封闭粹使出轨  
/D  “_世爵娱乐平台”  相当于  #define  _世爵娱乐平台,翻开调试编码使出轨  
保养效能)  
/ZI  发觉  Edit  and 持续(编译持续)资料库,在调试  
万一源编码中修正,不必要再补数  
/GZ 可以扶助估价内存反对的  
/Gm 翻开极小值的重行衔接使出轨,缩减衔接工夫  
Release  版本:    
/MD  /ML  或  /MT 应用运转时职务库的发行物版本  
/O1  或  /O2 优化组合使出轨,使顺序最小或快动作的  
/D  “N世爵娱乐平台”  封闭限制编译调试编码使出轨(即不编译保养效能)  
/GF 合反复的字母串,并将字母串常数放在只读内存中。,避免  
被修正  
竟,Debug  和  Release 没实质的界线,它们公正的一组缀编者选择权集。,缀编者只主要成分命定的用手操作选择权。实际上,咱们甚至可以使变为这些选择权。,经过尾随走快优化组合调试版本或发行物版本。  
二、哪一些养护下  Release 版本会出错  
受胎过去的的绍介,让咱们来看一眼这些选择权,单独接单独地把持。  Release 版本反对的是怎么发生的  
1.  Runtime  Library:哪个运转时职务库通常只衔接到。调试版本  Runtime  Library 组编调试交流,和稍许的支持机制是用来扶助找到反对的,如此功能不如发行版好。。缀编者开价  Runtime  Library 它通常去波动。,不克不及的形成  Release 版本反对的;这是鉴于  Debug  的  Runtime  Library 增强违法检测,相象堆内存分派,偶尔它如同  Debug 但反对的  Release  定期地的景象。该当索引的是,万一  Debug  犯罪,纵然  Release  定期地,必然有编排。  Bug  的,这是惟一的可能性的。  Release The version of a run did not show up。  
2.  优化组合:这是形成这一反对的的次要原因。,因源顺序基本是直地翻译者时的优化组合,翻开优化组合后的缀编者会做出系列假定。。这些典型的反对的次要有以下几种:  
(1) 帧搀扶(帧) 搀扶)省略(缩写)  FPO  ):在职务叫来会议记录,拿呼叫交流(统计表地址)、自动化机器或设备变量参量放在堆栈上。。万一该职务的陈述和完成清楚的(参量、统计表值、呼叫),会有反对的……不过  Debug 在巡回演出,对堆栈的拜访经过  EBP 流露记忆地址完成,万一你没反对的的衣服,如穿越边界的(或日,职务通常是定期地实施的。;Release 在巡回演出,优化组合会省略  EBP  栈基址搀扶,以这种方法,统计表地址反对的是由顺序经过g碎裂使遭受的。。C++ 强典型可以反省显得庞大反对的。,不过万一应用冲动典型替换,就会死的。你可以在  Release 冲动进入版本  /Oy- 编译选择权以封闭帧搀扶省略。,断定这种反对的能否是反对的的。。左右反对的通常是:  
●  MFC 音讯响应职务写反对的。加标题应该是  
afx_msg  LRESULT  OnMessageOwn(WPARAM  wparam,  LPARAM  lparam);  
ON_MESSAGE 宏组编冲动典型替换。避免这种反对的的方法经过是重行解释。  ON_MESSAGE  宏,将下列的编码添加到以下编码中   在#组编  “”然后),职务出过时的事或人编译将为false。  
#undef  ON_MESSAGE  
#define  ON_MESSAGE(message,  memberFxn)  /  
{  message,  0,  0,  0,  AfxSig_lwl,  /  
(AFX_PMSG)(AFX_PMSGW)(static_cast<  LRESULT  (AFX_MSG_CALL  /  
CWnd::*)(WPARAM,  LPARAM)  >  (&memberFxn)  },  
(2)  volatile  型变量:volatile 通知缀编者该变量可以在单独未知的方法来修正、以此类推会议记录和线索)。为了预付优化组合顺序的功能,很多变量通常放在流露中(相象地r)。  register 关键词),以此类推会议记录仅仅修正变量某种情势或位置的内存。,流露的值没使变为。。万一你的顺序是多线索的,或许你被发现的人单独变量的值与预见意见相左,很可能性不期而遇左右的成绩。。这种反对的偶尔表示为一种优化组合极小值的顺序。添加变量是你以为值当疑心。  volatile  试试。  
(3) 变量优化组合:优化组合器主要成分变量的应用来优化组合变量。。譬如,职务中有单独变量未被应用。,在  Debug 它可以毯状物开拓的上的单独部署兵力。,而在  Release  版中,左右变量可能性会被整洁的。,在这种养护下,衣服溢出将失事ST中耐用的的资料。。自然,实际养护比这要复杂得多。。与此中间定位的反对的:  
●  违法的拜访,组编以手围绕测量类似测量边界的的衣服、搀扶反对的等。。譬如  
void FN(病人用的)  
{  
int  i;  
i  =  1;  
int [ 4 ]  
{  
int  j;  
j  =  1;  
}  
[ 1 ]  = 1;/自然,没这么聪明的的反对的。,譬如,下标是单独变量。  
[ 4 ]  =  1;  
}  
j 不在乎衣服达到目标边界的有功能域,但打孔还没被取。,如此  i  和  j 它将毯状物开拓的的过境点。。而  Release 版鉴于  i、j 没什么大的所有物可以优化组合。,如此,堆栈被失事。  
3.  _世爵娱乐平台  与  N世爵娱乐平台  :当解释  _世爵娱乐平台  时,assert() 职务将被编译。,而  N世爵娱乐平台 没编译。在旁边,vc中有系列断言宏。。这组编:  
ANSI  C  断言  void 断言(int  expression  );  
C  Runtime  Lib  断言  _ASSERT(  booleanExpression  );  
_ASSERTE(  booleanExpression  );  
MFC  断言  ASSERT(  booleanExpression  );  
VERIFY(  booleanExpression  );  
ASSERT_VALID(  pObject  );  
ASSERT_KINDOF(  classname,  pobject  );  
ATL  断言  ATLASSERT(  booleanExpression  );  
更,TRACE() 宏缀编也受到  _世爵娱乐平台  把持。  
拿这些断言只在 编译调试版本。,而在  Release 在版本中疏忽。惟一的的不规则的事物是  VERIFY()  。实际上,这些高地宏  assert()  职务,只需添加稍许的与库中间定位的调试编码。万一您在这些宏中暂代他人职务部分无论哪一些顺序编码,不公正的乔治英国数学家和逻辑学家说法(譬如任命)、单独可以使变为变量值的职务叫来。  等),这么  Release 版本将实施这些用手操作,这样形成反对的。初学者倾向于犯左右的反对的,查找的方法也很简略,因下面列出了这些宏,公正的用它  VC++  的  Find  in  Files 该效能可以与单独局部的在定约雇用达到目标拿用锉锉。在旁边,稍许的妙手可以暂代他人职务部分。  #ifdef  _世爵娱乐平台 编译限制如次,也要小心它。。  
附带地提一下,它值当一提。  VERIFY()  宏,此宏容许您在乔治英国数学家和逻辑学家说法中训练编码。。左右宏通常用来反省。  Windows  API  的统计表值。某些人可能性因左右原如此被亏待。  VERIFY()  ,实际上,这很使遭受危险。,因  VERIFY() 单独关心,违背断言,不克不及将顺序编码与调试编码完整舍弃。,可能性终极会形成很多折磨。。从此处,专家提议尽量性少地应用宏。。  
4.  /GZ  选择权:左右选择权会做这些事实  
(1) 设定初值内存和变量。组编应用  0xCC 设定初值拿自动化机器或设备变量,0xCD  (  Cleared  Data  ) 内存(即静态分派的内存)分派在initiali,譬如  new  ),0xDD  (  Dead  Data  ) 满足已清偿的堆内存(譬如  delete  ),0xFD(  deFencde  Data  ) 受支持内存设定初值(调试) 该版本被添加到内存的静态分派中,以支持便笺。,等级里的单词是微软的提议。。左右做的漂亮的是这些值去大。,作为单独搀扶是做不到的性的(  32 位零碎中没有多少的搀扶是剩余的。,在稍许的零碎中,剩余的个搀扶会发生运转时反对的。,作为单独数值,它是没有多少不期而遇,这些值是轻易识别,如此对它有漂亮的。  Debug 在版本中找到  Release 版本达到目标反对的。应特殊小心,很多人以为缀编者会应用它  0 设定初值变量,这是反对的的(逆被发现的人反对的)。  
(2) 当经过职务搀扶叫来职务时,经过反省堆栈搀扶来使合法化职务叫来的婚配。(避免原始不婚配)  
(3) 职务在职务统计表先前反省堆栈搀扶。,身份证明它没被修正。(避免跨界拜访和原始模型的不婚配,化合第二的项可以粗略地仿照帧搀扶省略。  FPO  )  
通常  /GZ 选择权将使遭受  Debug 版本反对的  Release 该版本的定期地景象,因  Release 未设定初值的变量在随机版,这可能性使遭受搀扶导演无效地址并毯状物。  
在旁边,/Gm  /GF 选择权达到目标反对的更少。,但所有物聪明的,这倾向于找到。。  
————————————————————–  
清偿是单独发行物版本,与调试版本比拟,有稍许的优化组合。,不足调试用锉锉的用锉锉  
调试是单独调试版本。,组编更多顺序交流  
Release方法:  
build->batch  build->build就OK.  
—————————————————–  
一、”调试是单独调试版本。,组编更多顺序交流”  
暂代他人职务:最适当的世爵娱乐平台版的顺序才干设置断点、单步实施、调试出口宣判,如尾随/断言。这种不组编无论哪一些调试交流,如此广大很小。、短时间做成的运转。  
二、出版物的普通方法是更hzh_shat(水) 突出所说的,你也可以定约雇用-设置  Active  Config,选择发行版。尔后,The results compiled by F5 or F7 is release version。   

LEAVE A REPLY