Debug和Release不一致

VC下Debug和Release区别

Debug和Release区别

原文见http://www.cnblogs.com/JemBai/archive/2009/01/13/1374805.html

另还有壹篇关于GCC下Debug和Release不一样

https://vinayakgarg.wordpress.com/2012/03/31/difference-between-debug-build-and-release-build/

VC下Debug和Release区别

目前写代码进度中,开掘 Debug 下运维如常,Release
下就会冒出难题,百思不得其解,而Release
下又不能够开始展览调护医疗,于是只可以使用printf方式逐步固化到难点所在处,才意识原先是给定的3个数组未伊始化,导致后边管理卓殊。英特网查找了些资料,在那罗列汇总下,做为备忘~ 
一、Debug 和 Release 的区别 
        Debug
平常称为调节和测试版本,它包涵调节和测试音讯,并且不作任何优化,便于技师调节和测试程序。Release
称为发表版本,它往往是开始展览了各样优化,使得程序在代码大小和周转速度上都以最优的,以便用户很好地使用。 
     Debug 和 Release 的实在区别,在于1组编写翻译选项。 
Debug 版本   
参数       含义   
/MDd /MLd 或 /MTd 使用 Debug runtime
library(调节和测试版本的周转时刻函数库)   
/Od 关闭优化开关   
/D “_DEBUG” 相当于 #define
_DEBUG,展开编写翻译调试代码按钮(首要针对assert函数)   
/ZI   
成立 艾德it and
continue(编辑继续)数据库,那样在调解进程中假若退换了源代码不需重新编译   
GZ 能够扶持捕获内部存款和储蓄器错误  

   
Release 版本 参数含义   
/MD /ML 或 /MT 使用发表版本的运行时刻函数库   
/O一 或 /O二 优化按钮,使程序最小或最快   
/D “NDEBUG” 关闭条件编写翻译调节和测试代码按钮(即不编写翻译assert函数)   
/GF 合不分畛域复的字符串,并将字符串常量放到只读内部存款和储蓄器,制止被改造  

Debug 和 Release
并不曾精神的尽头,他们只是一组编写翻译选项的晤面,编写翻译器只是根据约定的选项行动。 
   
连带经历: 转自http://dev.csdn.net/article/17/17068.shtm 

  1. 变量。 
    世家都清楚,debug跟release在开始化变量时所做的操作是见仁见智的,debug是将每一种字节位都赋成0xcc(注1),而release的赋值近
    似于自由(笔者想是从来从内部存款和储蓄器中分配的,未有开首化过)。那样就一览无遗了,假如您的主次中的有个别变量没被开端化就被引述,就很有望出现至极:用作调控变量将
    导致流程导向不1致;用作数组下标将会使程序崩溃;越发大概是变成其余变量的禁止确而滋生别的的失实。所以在申明变量后旋即对其初叶化三个默许的值是最轻巧有效的主意,不然项目大了您找都没地点找。代码存在错误在debug方式下恐怕会忽略而不被发觉到,如debug格局下数组越界也大都不会出错,在
    release中就展揭发来了,那些找起来就比较难了:( 依然要多数加注意吧 
    呵呵,就是小编犯的主题材料~~ 
  2. 自定义音讯的音讯参数。 
    MFC为大家提供了很好的新闻机制,更充实了自定义新闻,好处小编就无须多说了。那也存在debug跟release的主题材料啊?答案是毫无疑问的。在自定义音信的函数体评释时,时常会看到那样的写法:afx_msg LRESULT OnMessageOwn();
    Debug意况下一般不会有别的难点,而当你在Release下且多线程或进程间接选举取了音信传递时就会导致无效句柄之类的谬误。导致这些破绽百出间接原因是音讯体的参数未有增多,即应当写成:afx_msg LRESULT OnMessageOwn(WPARAM
    wparam, LPARAM lparam); (注2) 
  3. release形式下不失误,但debug情势下报错。 
    那种景色下基本上也是因为代码书写不得法引起的,查看MFC的源码,能够窥见繁多ASSERT的讲话(断言),那个宏只是在debug形式下才使得,那么就
    清楚了,release版不报错是忽视了不当而不是从未不当,那恐怕存在非常的大的隐患,因为是Debug情势下,比较便宜调节和测试,好好的检查自个儿的代码,再此
    就不多说了。 
  4. ASSERT, VERIFY, TRACE……….调试宏 
    那种状态很轻易解释。举例:请在VC下输入ASSERT然后选中按F1二跳到宏定义的地方,那里您就可见察觉Debug中ASSERT要实行AfxAssertFailedLine,而Release下的宏定义却为”#define ASSERT(f)
    ((void)0)”。所以注目的在于那么些调节和测试宏的言语不要用程序相关变量如i++写操作的言辞。VE瑞虎IFY是个不等,”#define
    VE猎豹CS6IFY(f)
    ((void)(f))”,即试行,那里的功用就不多探究了,有乐趣可协调查钻研究:)。

总结: 
Debug与Release分化的标题在刚开端编制代码时会平时发出,9玖%是因为你的代码书写错误而变成的,所以不要动不动就说系统难题或编写翻译器难题,
努力找找本人的缘由才是有史以来。笔者过去就隔叁差五蒙受这景况,经历过2回次的训诫后小编就起来注目了,未来自家所写过的代码作者早就好久没遭遇这种主题素材了。上面是多少个制止的方面,尽管未有那种主题材料也应小心一下: 
壹.
注意变量的初阶化,越发是指针变量,数组变量的开首化(十分大的情景下另作思量了)。 

  1. 自定义务消防队息及任何注脚的正儿八经写法 
  2. 动用调节和测试宏时使用后最佳注释掉 
  3. 尽量使用try – catch(…) 
  4. 尽心尽力选拔模块,不但表明清楚而且有益于调试。 
    注1: 
    debug版开端化成0xcc是因为0xcc在x八陆下是一条int
    3单步中断指令,那样程序1旦跑飞了遭受0xcc就会停下来,那和单片机编制程序时相似将没用的代码空间填入jmp
    0000语句是均等地转贴于:计算机二级考试_考试大【责编:drfcy 纠错】

[VC]DEBUG和RELEASE200七年0八月二二十四日 星期二 清晨 0四:33    I.   
内部存款和储蓄器分配难题   
    
   1.    变量未开端化。下边的次第在debug中运作的很好。   
    
   thing    *    search(thing    *    something)   
   BOOL    found;   
   for(int    i    =    0;    i    <    whatever.GetSize();   
i++)   
   {   
   if(whatever[i]->field    ==    something->field)   
   {    /*    found    it    */   
   found    =    TRUE;   
   break;   
   }    /*    found    it    */   
   }   
   if(found)   
   return    whatever[i];   
   else   
   return    NULL;   
  
而在release中却不行,因为debug中会自动给变量初叶化found=FALSE,而在release版中则不会。所以尽恐怕的给变量、类或协会初叶化。   
    
   2.    数据溢出的标题   
    
   如:char    buffer[10];   
   int    counter;   
    
   lstrcpy(buffer,    “abcdefghik”);   
    
  
在debug版中buffer的NULL覆盖了counter的高位,可是除非counter>1陆M,什么难点也一向不。可是在release版
中,counter大概被放在寄存器中,那样NULL就覆盖了buffer下边的半空中,只怕正是函数的归来地址,那将导致ACCESS   
ECR-VRO奥迪Q3。   
    
   三.    DEBUG版和RELEASE版的内部存储器分配办公室法是例外的   
。假设您在DEBUG版中申请    ele    为   
6*sizeof(DWO讴歌ZDXD)=二肆bytes,实际上分配给你的是3二bytes(debug版以32bytes为单位分配),   
而在release版,分配给你的正是二四bytes(release版以八bytes为单位),所以在debug版中壹经您写ele[6],恐怕不会有啥难题,而在release版中,就有ACCESS    VIOLATE。   
    
   II.    ASSERT和VERIFY   
    
   1.    ASSERT在Release版本中是不会被编译的。   
    
   ASSERT宏是如此定义的   
    
   #ifdef    _DEBUG   
   #define    ASSERT(x)    if(    (x)    ==    0)   
report_assert_failure()   
   #else   
   #define    ASSERT(x)   
   #endif   
  
实际上复杂一些,但无所谓。如若你在那些语句中加了程序中务须要有的代码   
   比如   
    
   ASSERT(pNewObj    =    new    CMyClass);   
    
   pNewObj->MyFunction();   
    
   那种时候Release版本中的pNewObj不会分配到空中   
    
  
所以试行到下二个讲话的时候程序会报该程序实行了非法操作的不当。那时能够用VERAV4IFY   
:   
    
   #ifdef    _DEBUG   
   #define    VERIFY(x)    if(    (x)    ==    0)   
report_assert_failure()   
   #else   
   #define    VERIFY(x)    (x)   
   #endif   
   那样的话,代码在release版中就足以实施了。   
    
   III.    参数难题:   
    
   自定义新闻的管理函数,必须定义如下:   
    
   afx_msg    LRESULT    OnMyMessage(WPARAM,    LPARAM);   
    
   重回值必须是HRESULT型,不然Debug会过,而Release出错   
    
   IV.    内部存款和储蓄器分配   
    
  
保障数据创建和扫除的统1性:借使二个DLL提供三个能够创造数量的函数,那么这一个DLL同时应当提供三个函数销毁那几个数据。数据的创立和排除应该在同贰个等级次序上。   
    
   V.    DLL的灾难   
    
   人们将分化版本DLL混合产生的不一致性形象的名字为   
“动态连接库的火坑“(DLL    Hell)   
,以至微软团结也这么说http://msdn.microsoft.com/library/techart/dlldanger1.htm)。   
    
   假诺你的先后行使你协和的DLL时请留心:   
    
   一.   
不可能将debug和release版的DLL混合在1块行使。debug都以debug版,release版都是release版。   
    
  
化解办法是将debug和release的次序分别位于主程序的debug和release目录下   
    
    
   2.    千万不要感觉静态连接库会消除难点,那只会使事态更欠好。   
    
   VI.    RELEASE板中的调节和测试    :   
    
   一.    将ASSERT()    改为    VEKugaIFY()    。寻找概念在”#ifdef   
_DEBUG”中的代码,假诺在RELEASE版本中须要那些代码请将他们移到定义外。查找TRACE(…)中代码,因为这一个代码在RELEASE中
也不被编写翻译。   
请认真检查那么些在RELEASE中必要的代码是不是并不曾被便宜。   
    
   二.   
变量的起先化所推动的两样,在差异的体系,或是在DEBUG/RELEASE版本间都留存这么的差异,所以请对变量实行开头化。   
    
   三.   
是不是在编写翻译时早已有了警告?请将警告等第设置为三或四,然后保险在编写翻译时未尝警示出现.   
    
   VII.    将Project    Settings”    中    “C++/C    ”   
项目下优化增选改为Disbale(Debug)。编写翻译器的优化恐怕引致成千上万竟然的失实,请参http://www.pgh.net/~newcomer/debug_release.htm   
    
   一.    其余对RELEASE版本的软件也足以开始展览调理,请做如下退换:   
    
   在”Project    Settings”    中    “C++/C    ”    项目下设置   
“category”    为    “General”    并且将”Debug    Info”设置为   
“Program    Database”。   
    
   在”Link”项目下选中”Generate    Debug    Info”检查框。   
    
   “Rebuild    All”   
    
   如此做法会发出的局地限量:   
    
   无法获取在MFC    DLL中的变量的值。   
    
   必须对该软件商讨所选取的保有DLL工程都进展退换。   
    
   另:   
    
   MS    BUG:MS的一份技术文书档案中标明,在VC5中对于DLL的”马克西姆ize   
Speed”优化增选并未有被全然帮助,因而那将会引起内部存款和储蓄器错误并导致程序崩溃。   
    
   2.    http://www.sysinternals.com/
一个顺序DebugView,用来捕捉OutputDebugString的输出,运转起来后(估摸是自设为system   
debugger)就足以看到全数程序的OutputDebugString的输出。此后,你能够脱离VC来运作你的主次并看到调节和测试音讯。   
    
   三.    有三个叫Gimpel   
Lint的静态代码检查工具,据悉相比好用http://www.gimpel.com/   
可是要化$的。

VC下Debug和Release区别

日前写代码进度中,开采 Debug 下运行符合规律化,Release
下就会并发难点,让本人百思不得其解,而Release
下又不恐怕张开调整,于是只好动用printf格局稳步牢固到标题所在处,才察觉原先是给定的叁个数组未起先化,导致后边管理卓殊。网络搜索了些资料,在那罗列汇总下,做为备忘~ 
一、Debug 和 Release 的区别 
        Debug
平常称为调节和测试版本,它富含调节和测试音讯,并且不作任何优化,便于程序员调节和测试程序。Release
称为发表版本,它往往是拓展了各个优化,使得程序在代码大小和周转速度上都以最优的,以便用户很好地行使。 
     Debug 和 Release 的实在区别,在于1组编写翻译选项。 
Debug 版本   
参数       含义   
/MDd /MLd 或 /MTd 使用 Debug runtime
library(调节和测试版本的运维时刻函数库)   
/Od 关闭优化按钮   
/D “_DEBUG” 相当于 #define
_DEBUG,展开编写翻译调节和测试代码按键(主要针对assert函数)   
/ZI   
始建 艾德it and
continue(编辑继续)数据库,那样在调节和测试进程中壹经济体改动了源代码不需另行编写翻译   
GZ 能够援助捕获内部存款和储蓄器错误  

多年来写代码进度中,发掘 Debug 下运营如常,Release
下就会并发难点,百思不得其解,而Release
下又不能够实行调护医治,于是只能接纳printf格局稳步固化到难题所在处,才发觉原先是给定的二个数组未开始化,导致后边管理分外。互联网搜寻了些资料,在那罗列汇总下,做为备忘~
一、Debug 和 Release 的区别
Debug
经常号称调节和测试版本,它涵盖调试消息,并且不作任何优化,便于程序猿调试程序。Release
称为揭橥版本,它往往是进行了种种优化,使得程序在代码大小和运行速度上都以最优的,以便用户很好地行使。
Debug 和 Release 的真的差异,在于一组编译选项。
Debug 版本
参数 含义
/MDd /MLd 或 /MTd 使用 Debug runtime library(调节和测试版本的运行时刻函数库)
/Od 关闭优化按键
/D “_DEBUG” 相当于 #define
_DEBUG,打开编写翻译调试代码开关(重要针对assert函数)
/ZI
创立 艾德it and
continue(编辑继续)数据库,那样在调度进度中壹经济体制改善动了源代码不需另行编写翻译
GZ 可以协理捕获内部存款和储蓄器错误

   
Release 版本 参数含义   
/MD /ML 或 /MT 使用发布版本的运行时刻函数库   
/O1 或 /O二 优化开关,使程序最小或最快   
/D “NDEBUG” 关闭条件编写翻译调试代码按键(即不编写翻译assert函数)   
/GF 合同样重视复的字符串,并将字符串常量放到只读内存,幸免被涂改  

Release 版本 参数含义
/MD /ML 或 /MT 使用宣布版本的周转时刻函数库
/O壹 或 /O二 优化按键,使程序最小或最快
/D “NDEBUG” 关闭条件编写翻译调节和测试代码按钮(即不编写翻译assert函数)
/GF 合同样重视复的字符串,并将字符串常量放到只读内部存款和储蓄器,幸免被退换

Debug 和 Release
并不曾精神的底限,他们只是1组编写翻译选项的集合,编写翻译器只是遵照约定的选项行动。 
   
有关经验: 转自http://dev.csdn.net/article/17/17068.shtm 

Debug 和 Release
并未实质的界限,他们只是一组编译选项的联谊,编写翻译器只是依据预订的选项行动。
相关经历: 转自http://dev.csdn.net/article/17/17068.shtm

  1. 变量。 
    我们都领悟,debug跟release在早先化变量时所做的操作是区别的,debug是将种种字节位都赋成0xcc(注一),而release的赋值近
    似于自由(小编想是向来从内部存款和储蓄器中分配的,未有开始化过)。那样就显著了,借使你的次序中的某些变量没被开首化就被引述,就很有希望现身格外:用作调整变量将
    导致流程导向不等同;用作数组下标将会使程序崩溃;尤其恐怕是促成其余变量的查禁确而引起别的的失实。所以在注解变量后立即对其开端化1个暗许的值是最简单有效的不2秘诀,不然项目大了您找都没地点找。代码存在破绽百出在debug方式下可能会忽视而不被察觉到,如debug方式下数组越界也大略不会出错,在
    release中就暴揭露来了,这些找起来就比较难了:( 照旧友多数加小心吧 
    呵呵,正是笔者犯的主题材料~~ 
  2. 自定义新闻的音信参数。 
    MFC为我们提供了很好的音信机制,更扩张了自定义新闻,好处作者就无须多说了。那也设有debug跟release的标题吧?答案是自然的。在自定义音信的函数体注解时,时常会看到那样的写法:afx_msg LRESULT OnMessageOwn();
    Debug意况下一般不会有其余难题,而当你在Release下且十②线程或进度间接选举取了消息传递时就会产生无效句柄之类的一无所长。导致那几个张冠李戴直接原因是新闻体的参数未有增添,即应当写成:afx_msg LRESULT OnMessageOwn(WPARAM
    wparam, LPARAM lparam); (注2) 
  3. release情势下不出错,但debug方式下报错。 
    那种状态下基本上也是因为代码书写不得法引起的,查看MFC的源码,能够开采大多ASSERT的语句(断言),这一个宏只是在debug格局下才使得,那么就
    清楚了,release版不报错是忽视了不当而不是绝非不当,那说不定期存款在相当大的隐患,因为是Debug方式下,比较便于调节和测试,好好的检查本人的代码,再此
    就不多说了。 
  4. ASSERT, VERIFY, TRACE……….调试宏 
    那种景色很轻巧解释。比如:请在VC下输入ASSERT然后选中按F12跳到宏定义的地点,那里您就能够察觉Debug中ASSERT要实行AfxAssertFailedLine,而Release下的宏定义却为”#define ASSERT(f)
    ((void)0)”。所以注目的在于那个调节和测试宏的讲话不要用程序相关变量如i++写操作的话语。VE奥迪Q5IFY是个例外,”#define
    VE安德拉IFY(f)
    ((void)(f))”,即实行,那里的功效就不多研究了,风乐趣可自身探讨:)。
  1. 变量。
    大家都驾驭,debug跟release在起头化变量时所做的操作是见仁见智的,debug是将各种字节位都赋成0xcc(注一),而release的赋值近
    似于自由(作者想是直接从内部存款和储蓄器中分红的,未有开始化过)。那样就肯定了,即便你的程序中的某些变量没被初叶化就被引述,就很有希望出现万分:用作调整变量将
    导致流程导向差别样;用作数组下标将会使程序崩溃;尤其或许是变成任何变量的查禁确而引起其余的失实。所以在注解变量后迅即对其初叶化1个暗中认可的值是最简单有效的法子,不然项目大了您找都没地点找。代码存在错误在debug方式下只怕会忽视而不被发觉到,如debug情势下数组越界也差不离不会出错,在
    release中就爆出出来了,这一个找起来就相比难了:( 依旧要许多加留意啊
    呵呵,正是作者犯的标题~~
  2. 自定义音信的音信参数。
    MFC为大家提供了很好的音信机制,更只增不减了自定义音讯,好处作者就无须多说了。那也存在debug跟release的标题吗?答案是必定的。在自定义新闻的函数体表明时,时常会合到如此的写法:afx_msg LRESULT OnMessageOwn();
    Debug情形下一般不会有其余难题,而当你在Release下且102线程或进程间采用了音讯传递时就会招致无效句柄之类的荒谬。导致这一个张冠李戴直接原因是消息体的参数未有增加,即应当写成:afx_msg LRESULT OnMessageOwn(WPARAM
    wparam, LPARAM lparam); (注2)
  3. release情势下不出错,但debug情势下报错。
    那种场馆下基本上也是因为代码书写不科学引起的,查看MFC的源码,能够窥见大多ASSERT的话语(断言),这几个宏只是在debug形式下才使得,那么就
    清楚了,release版不报错是忽视了不当而不是不曾错误,那大概存在非常大的隐患,因为是Debug方式下,相比较便于调试,好好的检讨自身的代码,再此
    就不多说了。
  4. ASSERT, VERIFY, TRACE……….调试宏
    那种处境很轻便解释。比如:请在VC下输入ASSERT然后选中按F12跳到宏定义的地点,那里你就能够察觉Debug中ASSERT要实施AfxAssertFailedLine,而Release下的宏定义却为”#define ASSERT(f)
    ((void)0)”。所以注目的在于那一个调节和测试宏的说话不要用程序相关变量如i++写操作的讲话。VEWranglerIFY是个不一致,”#define
    VE奥迪Q7IFY(f)
    ((void)(f))”,即实行,那里的作用就不多研究了,风乐趣可自身切磋:)。

总结: 
Debug与Release不一样的主题素材在刚开始编写制定代码时会平日发生,9九%是因为您的代码书写错误而致使的,所以不要动不动就说系统难点或编写翻译器难题,
努力找找自个儿的原由才是素有。小编过去就平日蒙受那景观,经历过贰遍次的教训后本人就初阶留心了,未来自家所写过的代码小编已经好久没碰着那种主题素材了。下边是多少个防止的地点,就算未有那种难题也应注意一下: 
1.
在意变量的初步化,特别是指针变量,数组变量的开始化(非常的大的情事下另作思念了)。 

总结:
Debug与Release分裂的难题在刚起先编写制定代码时会通常产生,99%是因为你的代码书写错误而招致的,所以不要动不动就说系统难题或编写翻译器难题,
努力找找自身的缘由才是一向。笔者过去就时常蒙受这一场合,经历过1次次的教训后笔者就从头在意了,未来笔者所写过的代码作者早就好久没遇到那种主题材料了。上边是几个防止的上边,就算未有那种主题材料也应留神一下:
一.
瞩目变量的初阶化,特别是指针变量,数组变量的开头化(极大的景象下另作思索了)。

  1. 自定义消息及别的申明的正规化写法 
  2. 运用调节和测试宏时使用后最好注释掉 
  3. 尽心尽力采取try – catch(…) 
  4. 尽大概利用模块,不但表明清楚而且有利于调节和测试。 
    注1: 
    debug版开头化成0xcc是因为0xcc在x8陆下是一条int
    三单步中断指令,那样程序1旦跑飞了境遇0xcc就会停下来,这和单片机编制程序时一般将没用的代码空间填入jmp
    0000语句是如出一辙地转贴于:Computer二级考试_考试大【责编:drfcy 纠错】
  1. 自定义务消防队息及别的证明的科班写法
  2. 使用调节和测试宏时使用后最佳注释掉
  3. 尽量选拔try – catch(…)
  4. 尽心尽力利用模块,不但表明清楚而且便于调节和测试。
    注1:
    debug版初步化成0xcc是因为0xcc在x八6下是一条int
    三单步中断指令,那样程序1旦跑飞了碰着0xcc就会停下来,那和单片机编程时相似将没用的代码空间填入jmp
    0000语句是1致地转贴于:Computer二级考试_考试大【责编:drfcy 纠错】
    [VC]DEBUG和RELEASE200柒年0四月230日 周6 中午 0四:3三 I. 内部存款和储蓄器分配难点
  5. 变量未初阶化。上面包车型客车次第在debug中运维的很好。
    thing * search(thing * something)
    BOOL found;
    for(int i = 0; i < whatever.GetSize(); i++)
    {
    if(whatever[i]->field == something->field)
    { /* found it */
    found = TRUE;
    break;
    } /* found it */
    }
    if(found)
    return whatever[i];
    else
    return NULL;
    而在release中却卓殊,因为debug中会自动给变量起先化found=FALSE,而在release版中则不会。所以尽只怕的给变量、类或组织早先化。
  6. 多少溢出的标题
    如:char buffer[10];
    int counter;
    lstrcpy(buffer, “abcdefghik”);
    在debug版中buffer的NULL覆盖了counter的要职,但是除非counter>16M,什么难点也并没有。可是在release版
    中,counter大概被放在寄存器中,那样NULL就覆盖了buffer上边包车型大巴半空中,大概正是函数的回到地址,那将促成ACCESS
    E奔驰M级RO索罗德。
  7. DEBUG版和RELEASE版的内部存款和储蓄器分配办法是见仁见智的 。假诺你在DEBUG版中申请 ele

    陆*sizeof(DWO卡宴D)=24bytes,实际上分配给您的是3二bytes(debug版以3二bytes为单位分配),
    而在release版,分配给您的就是贰4bytes(release版以八bytes为单位),所以在debug版中一旦你写ele[6],大概不会有啥难题,而在release版中,就有ACCESS VIOLATE。
    II. ASSERT和VERIFY
  8. ASSERT在Release版本中是不会被编写翻译的。
    ASSERT宏是那般定义的
    #ifdef _DEBUG
    #define ASSERT(x) if( (x) == 0) report_assert_failure()
    #else
    #define ASSERT(x)
    #endif
    实质上复杂一些,但无所谓。假设你在那一个语句中加了先后中务要求有的代码
    比如
    ASSERT(pNewObj = new CMyClass);
    pNewObj->MyFunction();
    那种时候Release版本中的pNewObj不会分配到空间
    因此实行到下一个言辞的时候程序会报该程序推行了不合法操作的荒唐。那时能够用VE奥迪Q7IFY

    #ifdef _DEBUG
    #define VERIFY(x) if( (x) == 0) report_assert_failure()
    #else
    #define VERIFY(x) (x)
    #endif
    那样的话,代码在release版中就足以实行了。
    III. 参数难点:
    自定义信息的处理函数,必须定义如下:
    afx_msg LRESULT OnMyMessage(WPARAM, LPARAM);
    重返值必须是HRESULT型,不然Debug会过,而Release出错
    IV. 内部存款和储蓄器分配
    保障数据创立和清除的统1性:倘若一个DLL提供叁个能够创造数量的函数,那么那些DLL同时应当提供1个函数销毁那些数据。数据的创始和扫除应该在同3个档期的顺序上。
    V. DLL的灾难
    人人将差异版本DLL混合变成的分化性形象的称为 “动态连接库的苦海“(DLL
    Hell)
    ,乃至微软温馨也那样说http://msdn.microsoft.com/library/techart/dlldanger1.htm)。
    万一你的次序行使你和睦的DLL时请小心:
    1.
    不能够将debug和release版的DLL混合在一起利用。debug都是debug版,release版都以release版。
    消除办法是将debug和release的次第分别位居主程序的debug和release目录下
  9. 相对不要以为静态连接库会消除难点,那只会使事态更不好。
    VI. RELEASE板中的调节和测试 :
  10. 将ASSERT() 改为 VE科雷傲IFY() 。找寻概念在”#ifdef
    _DEBUG”中的代码,假设在RELEASE版本中供给那几个代码请将他们移到定义外。查找TRACE(…)中代码,因为那一个代码在RELEASE中
    也不被编写翻译。 请认真检查那二个在RELEASE中必要的代码是还是不是并不曾被便宜。
    二.
    变量的伊始化所带来的例外,在不一样的系统,或是在DEBUG/RELEASE版本间都留存这么的距离,所以请对变量进行初始化。
    三.
    是或不是在编写翻译时曾经有了警示?请将警告等级设置为三或四,然后保障在编写翻译时未尝警示出现.
    VII. 将Project Settings” 中 “C++/C ”
    项目下优化增选改为Disbale(Debug)。编写翻译器的优化也许导致众多想不到的荒唐,请参http://www.pgh.net/~newcomer/debug_release.htm
  11. 其余对RELEASE版本的软件也能够实行调治,请做如下改动:
    在”Project Settings” 中 “C++/C ” 项目下设置 “category” 为 “General”
    并且将”Debug Info”设置为 “Program Database”。
    在”Link”项目下选中”Generate Debug Info”检查框。
    “Rebuild All”
    如此做法会发生的有的限制:
    心中无数获取在MFC DLL中的变量的值。
    务必对该软件商量所采取的有所DLL工程都开展改变。
    另:
    MS BUG:MS的一份本事文书档案中标明,在VC5中对此DLL的”马克西姆ize
    Speed”优化增选并未被统统协理,因而那将会挑起内部存款和储蓄器错误并变成程序崩溃。
  12. http://www.sysinternals.com/
    一个程序DebugView,用来捕捉OutputDebugString的输出,运维起来后(猜度是自设为system
    debugger)就足以看出所有程序的OutputDebugString的输出。此后,你能够退出VC来运作你的主次并见到调节和测试消息。
  13. 有3个叫Gimpel
    Lint的静态代码检查工具,据书上说比较好用http://www.gimpel.com/
    可是要化$的。

[VC]DEBUG和RELEASE200七年0十一月26日 星期一 晚上 0肆:3三    I.   
内部存款和储蓄器分配难点   
    
   1.    变量未开端化。下边包车型的士次序在debug中运作的很好。   
    
   thing    *    search(thing    *    something)   
   BOOL    found;   
   for(int    i    =    0;    i    <    whatever.GetSize();   
i++)   
   {   
   if(whatever[i]->field    ==    something->field)   
   {    /*    found    it    */   
   found    =    TRUE;   
   break;   
   }    /*    found    it    */   
   }   
   if(found)   
   return    whatever[i];   
   else   
   return    NULL;   
  
而在release中却非常,因为debug中会自动给变量初步化found=FALSE,而在release版中则不会。所以尽量的给变量、类或协会初叶化。   
    
   二.    数据溢出的主题材料   
    
   如:char    buffer[10];   
   int    counter;   
    
   lstrcpy(buffer,    “abcdefghik”);   
    
  
在debug版中buffer的NULL覆盖了counter的要职,但是除非counter>1陆M,什么难点也尚未。不过在release版
中,counter大概被放在寄存器中,那样NULL就覆盖了buffer下边包车型客车空间,恐怕便是函数的回到地址,这将招致ACCESS   
ECRUISERRO哈弗。   
    
   叁.    DEBUG版和RELEASE版的内部存款和储蓄器分配办法是见仁见智的   
。假设你在DEBUG版中申请    ele    为   
六*sizeof(DWO途睿欧D)=二肆bytes,实际上分配给你的是3贰bytes(debug版以32bytes为单位分配),   
而在release版,分配给您的正是二四bytes(release版以8bytes为单位),所以在debug版中若是您写ele[6],恐怕不会有啥难题,而在release版中,就有ACCESS    VIOLATE。   
    
   II.    ASSERT和VERIFY   
    
   一.    ASSERT在Release版本中是不会被编写翻译的。   
    
   ASSERT宏是这样定义的   
    
   #ifdef    _DEBUG   
   #define    ASSERT(x)    if(    (x)    ==    0)   
report_assert_failure()   
   #else   
   #define    ASSERT(x)   
   #endif   
  
实际上复杂一些,但无所谓。假诺你在这几个语句中加了程序中必须要有个别代码   
   比如   
    
   ASSERT(pNewObj    =    new    CMyClass);   
    
   pNewObj->MyFunction();   
    
   那种时候Release版本中的pNewObj不会分配到空中   
    
  
所以试行到下一个讲话的时候程序会报该程序实施了违法操作的谬误。那时能够用VELX570IFY   
:   
    
   #ifdef    _DEBUG   
   #define    VERIFY(x)    if(    (x)    ==    0)   
report_assert_failure()   
   #else   
   #define    VERIFY(x)    (x)   
   #endif   
   那样的话,代码在release版中就足以实行了。   
    
   III.    参数难点:   
    
   自定义音讯的处理函数,必须定义如下:   
    
   afx_msg    LRESULT    OnMyMessage(WPARAM,    LPARAM);   
    
   再次来到值必须是HRESULT型,不然Debug会过,而Release出错   
    
   IV.    内部存款和储蓄器分配   
    
  
保证数据创造和排除的统一性:假使二个DLL提供多个力所能及创制数量的函数,那么那几个DLL同时应当提供3个函数销毁这么些数据。数据的创造和清除应该在同3个等级次序上。   
    
   V.    DLL的灾难   
    
   人们将分歧版本DLL混合变成的不一致性形象的号称   
“动态连接库的苦海“(DLL    Hell)   
,乃至微软温馨也这么说http://msdn.microsoft.com/library/techart/dlldanger1.htm)。   
    
   如若你的先后行使你本身的DLL时请留心:   
    
   壹.   
不能够将debug和release版的DLL混合在联合使用。debug都是debug版,release版都是release版。   
    
  
解决办法是将debug和release的次序分别放在主程序的debug和release目录下   
    
    
   二.    千万不要以为静态连接库会消除难题,那只会使事态更不佳。   
    
   VI.    RELEASE板中的调节和测试    :   
    
   1.    将ASSERT()    改为    VEEscortIFY()    。寻觅概念在”#ifdef   
_DEBUG”中的代码,若是在RELEASE版本中须要这么些代码请将他们移到定义外。查找TRACE(…)中代码,因为那几个代码在RELEASE中
也不被编写翻译。   
请认真检查那几个在RELEASE中需求的代码是或不是并不曾被便宜。   
    
   贰.   
变量的开首化所推动的例外,在不一样的种类,或是在DEBUG/RELEASE版本间都留存这么的出入,所以请对变量进行伊始化。   
    
   三.   
是不是在编写翻译时已经有了警告?请将警告等级设置为三或四,然后保险在编译时不曾警示出现.   
    
   VII.    将Project    Settings”    中    “C++/C    ”   
项目下优化增选改为Disbale(Debug)。编写翻译器的优化大概产生众多不敢相信 无法相信的谬误,请参http://www.pgh.net/~newcomer/debug_release.htm   
    
   一.    别的对RELEASE版本的软件也可以进行调治将养,请做如下改造:   
    
   在”Project    Settings”    中    “C++/C    ”    项目下设置   
“category”    为    “General”    并且将”Debug    Info”设置为   
“Program    Database”。   
    
   在”Link”项目下选中”Generate    Debug    Info”检查框。   
    
   “Rebuild    All”   
    
   如此做法会发生的一部分范围:   
    
   不能赢得在MFC    DLL中的变量的值。   
    
   必须对该软件研究所利用的持有DLL工程都开始展览改变。   
    
   另:   
    
   MS    BUG:MS的壹份才干文书档案中标明,在VC5中对于DLL的”马克西姆ize   
Speed”优化增选并未有被全然协理,由此那将会挑起内部存款和储蓄器错误并促成程序崩溃。   
    
   2.    http://www.sysinternals.com/
一个主次DebugView,用来捕捉OutputDebugString的输出,运转起来后(猜测是自设为system   
debugger)就足以见见全部程序的OutputDebugString的输出。此后,你能够退出VC来运作你的主次并见到调节和测试音讯。   
    
   三.    有2个叫Gimpel   
Lint的静态代码检查工具,听闻相比好用http://www.gimpel.com/   
但是要化$的。

相关文章