release和debug两种编译模式,下面说说两种有何区别以及DEBUG成功的版本RELEASE 就有问题的原因分析,包含ASSERT问题

之前写过一篇解决:使用VS编写程序在运行“开始执行不调试”时,弹出命令窗口,显示“…exe不是内部或外部命令,也不是可运行程序或批处理文件”的文章

https://blog.csdn.net/weixin_42000717/article/details/123628431?spm=1001.2014.3001.5501

里面提到release和debug两种编译模式,现在谈谈两种有何区别

一、release和debug是不同的运行方式
debug会增加调试代码,方便调试
调试完后,用release版本
发布,没有调试代码,减小程序体积,加快执行速度

(既然obj就放中间代码的目录,为什吗还要release呢?同理,既然bin是放最终代码的目录还要debug干什吗?)

编译一个源程序文件,要经过语法、类型,甚至要判断执行时的可行性等。是一个对文件多次扫描的过程,最后还有代码优化的过程。会有一大堆的中间文件产生。vc6下的一个mfc项目 obj目录里会有好几M的中间(临时)文件。 再复杂点,一个project有图片(声音)等资源文件,要调用其他DLL类库(可能是.net组件,可能是com),还可能由多个.cs文件组成。要把 这么多东西连接在一起。以前在DOS下用C或PASCAL,要先编译成.obj文件,再用link.exe连接在一起,才是一个exe文件。(记得 pascal还是fortran要用两个编译程序才能得到一个.obj的中间文件)

结论:编译需要大量的中间文件存放临时结果,为下一步做准备。C#是面向对象的复杂度更高!obj目录就是用来存放临时文件的!

二、debug & release

① debug调试,你在程序中设置了断点,为什么vs.net知道在那里要停下来,当你把鼠标移到某个变量上,vs.net就会显示它当时的值?

因为编译器在代码中添加了许多调试需要的代码,可以让vs.net得到,返回给你。
这些代码当然是要占用空间和时间的,在你的程序调试完了后,可以正确运行了。完全可以去掉这些代码,这时候就应该用Release模式了。

不管Debug还是Release模式,都要编译,都有中间临时代码产生,所以obj目录下有debug release目录。两种模式编译的结果,就放在bin目录下。
编译完后,中间临时代码是没什么用的了,所以一般不管obj目录里的东西!

② 在用VS(或者VC等软件)编译时有debug和release两种,有什么区别呢

debug为调试版本,其中包括了出错时能够定位源代码的在行,如果源文件已经改变,定位出来会有偏移,而且,在这个版本中编译器不会进行代码优化,并且在程序中能用宏定义_DEBUG来确定当前的版本。

release为正试版本,程序出错只是进行简单的错误处理,编译器会优化代码,以提高性能。
Release代码更小,执行更快,编译更严格,更慢
当然就没有了调试信息

③经常你会遇到DEBUG成功的版本RELEASE 就有问题,以下是问题的分析总结
DEBUG和RELEASE 版本差异及调试相关问题:

. 内存分配问题

  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版中则不会。所以尽可能的给变量、类或结构初始化。

  1. 数据溢出的问题

如:char buffer[10];
int counter;

lstrcpy(buffer, “abcdefghik”);

在debug版中buffer的NULL覆盖了counter的高位,但是除非counter>16M,什么问题也没有。但是在release版中,counter可能被放在寄存器中,这样NULL就覆盖了buffer下面的空间,可能就是函数的返回地址,这将导致ACCESS ERROR。

  1. 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出错

原文链接:https://www.cnblogs.com/cwwmmv/p/9151386.html

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Release版本Debug版本在软件开发中有以下几个区别: 1. 文件大小:Release版本的文件比Debug版本的文件要小。这是因为Release版本进行了优化,去除了调试信息和其他不必要的内容,以减小文件体积。 2. 程序信息:Debug版本包含更多的程序信息,比如变量名、函数名等。这方便了开发人员在调试过程中查看和理解代码。而Release版本由于去除了这些信息,使得代码难以被读懂。 3. 调试功能:只有Debug版本的程序才能设置断点、单步执行、使用TRACE/ASSERT等调试输出语句。这些功能对于开发人员来非常重要,因为它们可以帮助在代码中定位问题和调试程序。 4. 运行速度:由于Release版本进行了优化,去除了调试信息和其他不必要的内容,所以它的运行速度通常比Debug版本更快。 总结来Release版本主要用于最终的软件发布,它经过了优化,文件大小小、运行速度快,但调试功能不可用。而Debug版本主要用于软件开发阶段,包含更多的程序信息和调试功能,方便开发人员进行代码调试和问题排查。<span class="em">1</span><span class="em">2</span> #### 引用[.reference_title] - *1* [iOS的releasedebug有什么区别](https://blog.csdn.net/DYZ904535626/article/details/44174635)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [win10下编译好的VTK(8.2 / 9.2.6) ,vs2019 + Qt 5.15,debugrelease版本都有](https://download.csdn.net/download/Idealtracy/87472670)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值