永发信息网

vs中debug和release版本的区别

答案:5  悬赏:30  手机版
解决时间 2021-03-11 20:23
vs中debug和release版本的区别
最佳答案
vs中的程序有debug和release两个版本。
1、版本不同
Debug通常称为调试版本,通过一系列编译选项的配合,编译的结果通常包含调试信息,而且不做任何优化,以为开发人员提供强大的应用程序调试能力。
而Release通常称为发布版本,是为用户使用的,一般客户不允许在发布版本上进行调试。
2、运行效果不同
debug程序通常比release程序要慢,尤其是处理视频方便release要比debug快很多。
3、算法不同
debug跟release在初始化变量时所做的操作是不同的,debug是将每个字节位都赋成0xcc, 而release的赋值近似于随机。



扩展资料:
二者的编译选项。
Debug 版本:
/Od 关闭优化开关
/D "_DEBUG" 相当于 #define _DEBUG,打开编译调试代码开关(主要针对assert函数)
/ZI 创建 Edit and continue(编辑继续)数据库,这样在调试过程中如果修改了源代码不需重新编译
/GZ 可以帮助捕获内存错误
/Gm 打开最小化重链接开关,减少链接时间
Release 版本:
/MD /ML 或 /MT 使用发布版本的运行时刻函数库  
/O1 或 /O2 优化开关,使程序 最小或最快  
/D "NDEBUG" 关闭条件编译调试代码开关(即不编译assert函数) 
 /GF 合并重复的字符串,并将字符串常量放到只读内存,防止被修改
可以理解Debug 和 Release 并没有本质的界限,他们只是一组编译选项的集合,编译器只是按照预定的选项行动。可以修改这些选项,从而得到优化过的调试版本或是带跟踪语句的发布版本。
参考资料来源:百度百科-vs (Visual Studio简称)
全部回答
Release版称为发行版,Debug版称为调试版。 Debug中可以单步执行、跟踪等功能,但生成的可执行文件比较大,代码运行速度较慢。Release版运行速度较快,可执行文件较小,但在其编译条件下 无法执行调试功能。 Release的exe文件链接的是标准的MFCDLL(UseMFCinasharedorstaticdll)。这些DLL在安装Windows的时 候,已经配置,所以这些程序能够在没有安装VisualC++6.0的机器上运行。
vs中的程序有debug和release两个版本,Debug通常称为调试版本,通过一系列编译选项的配合,编译的结果通常包含调试信息,而且不做任何优化,以为开发 人员提供强大的应用程序调试能力。而Release通常称为发布版本,是为用户使用的,一般客户不允许在发布版本上进行调试。所以不保存调试信 息,同时,它往往进行了各种优化,以期达到代码最小和速度最优。为用户的使用提供便利。 debug程序通常比release程序要慢,尤其是处理视频方便release要比debug快很多。在release模式对程序进行调试的时候经常会遇到变量虽然初始化了,但是在查看其值的时候却发现是一个随机的数并不是初始化的值,有时候在对变量进行监视的时候了,会出现找不到变量的情况,原因大致如下: debug跟release在初始化变量时所做的操作是不同的,debug是将每个字节位都赋成0xcc, 而release的赋值近似于随机。如果你的程序中的某个变量没被初始化就被引用,就很有可能出现异常:用作控制变量将导致流程导向不一致;用作数组下标将会使程序崩溃;更加可能是造成其他变量的不准确而引起其他的错误。所以在声明变量后马上对其初始化一个默认的值是最简单有效的办法,否则项目大了你找都没地方找。代码存在错误在debug方式下可能会忽略而不被察觉到。debug方式下数组越界也大多不会出错,在release中就暴露出来了,这个找起来就比较难了。 只有DEBUG版的程序才能设置断点、单步执行、使用 TRACE/ASSERT等调试输出语句。REALEASE不包含任何调试信息,所以体积小、运行速度快。
Debug和Release区别   VC下Debug和Release区别   最近写代码过程中,发现 Debug 下运行正常,Release 下就会出现问题,百思不得其解,而Release 下又无法进行调试,于是只能采用printf方式逐步定位到问题所在处,才发现原来是给定的一个数组未初始化,导致后面处理异常。网上查找了些资料,在这 罗列汇总下,做为备忘~   一、Debug 和 Release 的区别   Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。   Debug 和 Release 的真正区别,在于一组编译选项。   Debug 版本   参数 含义   /MDd /MLd 或 /MTd 使用 Debug runtime library(调试版本的运行时刻函数库)   /Od 关闭优化开关   /D "_DEBUG" 相当于 #define _DEBUG,打开编译调试代码开关(主要针对assert函数)   /ZI   创建 Edit and continue(编辑继续)数据库,这样在调试过程中如果修改了源代码不需重新编译   GZ 可以帮助捕获内存错误   Release 版本 参数含义   /MD /ML 或 /MT 使用发布版本的运行时刻函数库   /O1 或 /O2 优化开关,使程序最小或最快   /D "NDEBUG" 关闭条件编译调试代码开关(即不编译assert函数)   /GF 合并重复的字符串,并将字符串常量放到只读内存,防止被修改   Debug 和 Release 并没有本质的界限,他们只是一组编译选项的集合,编译器只是按照预定的选项行动。     1. 变量。   大家都知道,debug跟release在初始化变量时所做的操作是不同的,debug是将每个字节位都赋成0xcc(注1),而release的赋值近 似于随机(我想是直接从内存中分配的,没有初始化过)。这样就明确了,如果你的程序中的某个变量没被初始化就被引用,就很有可能出现异常:用作控制变量将 导致流程导向不一致;用作数组下标将会使程序崩溃;更加可能是造成其他变量的不准确而引起其他的错误。所以在声明变量后马上对其初始化一个默认的值是最简 单有效的办法,否则项目大了你找都没地方找。代码存在错误在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++写操作的语句。VERIFY是个例外,"#define VERIFY(f) ((void)(f))",即执行,这里的作用就不多追究了,有兴趣可自己研究:)。   总结:   Debug与Release不同的问题在刚开始编写代码时会经常发生,99%是因为你的代码书写错误而导致的,所以不要动不动就说系统问题或编译器问题, 努力找找自己的原因才是根本。我从前就常常遇到这情况,经历过一次次的教训后我就开始注意了,现在我所写过的代码我已经好久没遇到这种问题了。下面是几个 避免的方面,即使没有这种问题也应注意一下:   1. 注意变量的初始化,尤其是指针变量,数组变量的初始化(很大的情况下另作考虑了)。   2. 自定义消息及其他声明的标准写法   3. 使用调试宏时使用后最好注释掉   4. 尽量使用try - catch(...)   5. 尽量使用模块,不但表达清楚而且方便调试。   注1:   debug版初始化成0xcc是因为0xcc在x86下是一条int 3单步中断指令,这样程序如果跑飞了遇到0xcc就会停下来,这和单片机编程时一般将没用的代码空间填入jmp 0000语句是一样地转贴于:计算机二级考试_考试大【责编:drfcy 纠错】   [VC]DEBUG和RELEASE2007年08月26日 星期日 下午 04: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 = TRUE;   break;   }   }   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>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宏是这样定义的   #ifdef _DEBUG   #define ASSERT(x) if( (x) == 0) report_assert_failure()   #else   #define ASSERT(x)   #endif   实际上复杂一些,但无关紧要。假如你在这些语句中加了程序中必须要有的代码   比如   ASSERT(pNewObj = new CMyClass);   pNewObj->MyFunction();   这种时候Release版本中的pNewObj不会分配到空间   所以执行到下一个语句的时候程序会报该程序执行了非法操作的错误。这时可以用VERIFY :   #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同时应该提供一个函数销毁这些数据。数据的创建和清除应该在同一个层次上。   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)。编译器的优化可能导致许多意想不到的错误   1. 此外对RELEASE版本的软件也可以进行调试,请做如下改动:   在"Project Settings" 中 "C++/C " 项目下设置 "category" 为 "General" 并且将"Debug Info"设置为 "Program Database"。   在"Link"项目下选中"Generate Debug Info"检查框。   "Rebuild All"   如此做法会产生的一些限制:   无法获得在MFC DLL中的变量的值。   必须对该软件所使用的所有DLL工程都进行改动。
vs中的程序有debug和release两个版本,Debug通常称为调试版本,通过一系列编译选项的配合,编译的结果通常包含调试信息,而且不做 任何优化,以为开发 人员提供强大的应用程序调试能力。而Release通常称为发布版本,是为用户使用的,一般客户不允许在发布版本上进行调试。所以不保存调试信 息,同时,它往往进行了各种优化,以期达到代码最小和速度最优。为用户的使用提供便利。   debug程序通常比release程序要慢,尤其是处理视频方便release要比debug快很多。   debug跟release在初始化变量时所做的操作是不同的,debug是将每个字节位都赋成0xcc, 而release的赋值近似于随机。   代码存在错误在debug方式下可能会忽略而不被察觉到。debug方式下数组越界也大多不会出错,在release中就暴露出来了,这个找起来就比较难了。   只有DEBUG版的程序才能设置断点、单步执行、使用 TRACE/ASSERT等调试输出语句。REALEASE不包含任何调试信息,所以体积小、运行速度快。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
怎样从一则新闻的五要素中,去分析事实与新闻
颜非所描,重庆美容化妆师学校哪里好#重庆化
如何关闭app store支付宝免密支付
哪颗卫星上有免费的本港台或者翡翠台
富伦特木工机械怎么去啊,有知道地址的么
我坐西部航空早上9点半的飞机,电子票要提前
全民主公鬼才郭嘉怎么得
【壮丽山河】中国有哪些壮丽山河
怎么开个p2p理财平台
鼻子怎么画简笔画正面
好滋味自助水饺地址有知道的么?有点事想过去
住宅装修过程中,因渗漏、管道堵塞等原因给邻
魅蓝note3配置怎么样 魅蓝note3参数详情
印尼华人为什么不像如大马华人那样对中国认同
梦芭莎是国内的品牌吗,用起来怎么样,服务如
推荐资讯
长江装饰城有限公司靖城分公司地址有知道的么
马来西亚吉隆坡到红土坎在哪里坐车,每天几班
荣威350的机油尺怎么插入
【jenifer】jennifer和jenifer是一样的吗~有
黄子韬道歉吴亦凡原谅了吗
索尼亚摄影地址有知道的么?有点事想过去
初一英语 help me你爸爸多大了?(两种说法)
我左臂上有一个纹身,纹的是一行英文字母,大
泰山医学院附属医院-干部保健与查体中心怎么
如何有效套牢客户
我的域名是国内域名cn,如果用HG的服务器解析
狮子包村卫生室地址在什么地方,想过去办事
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?