错误css下拉菜单
css下拉菜单 时间:2021-05-19 阅读:(
)
IAR的Workspace顶部下拉菜单中Debug和Release区别Hanson-he在IAR的Workspace窗口顶部的下拉菜单中有两个选项,Debug和Release.
名字和数量可以在菜单栏的Project-->EditConfiguration中增删修改.
每个选项都对应着一种配置(也就是项目名称右击Options里的内容),互相是独立的.
所以用起来很方便,直接在不同的配置间切换.
realse版本与debug版本的区别如下:DEBUG版本和RELEASE版本的区别:DEBUG版本里会包括基本的调试信息,供开发和调试使用;而RELEASE版本不会包括调试信息,一般是发布给用户使用.
所以你会发现DEBUG版本的SIZE比RELEASE版本会大许多.
另外,RELEASE版本在编译链接的时候检查会更严格,所以有时候会出现DEBUG版本能使用,而RELEASE版本却会出现一些问题的情况.
编译器优化级别,链接器输出文件的格式(是否包含调试信息等),当然,debug和release这两种buildconfiguration的属性,在project创建完之后是可以任意修改的.
虽然可能在Release版本下没有问题,但是并不等于说程序没有Bug,只是由于运行库进行了优化和丢弃,问题没有明显的展现出来,这样隐含式的错误后期很难再找出来,即使发现了,也由于编码的原因,修改困难.
所以考虑还是在开发的阶段尽量的用debug方式编译和修改,当在debug模式下没有问题以后再改为release生成给客户运营用.
一、Debug和Release编译方式的本质差别Debug通常称为调试版本,他包含调试信息,并且不作所有优化,便于程式员调试程式.
Release称为发布版本,他往往是进行了各种优化,使得程式在代码大小和运行速度上都是最优的,以便用户非常好地使用.
Debug和Release的真正秘密,在于一组编译选项.
下面列出了分别针对二者的选项(当然除此之外更有其他一些,如/Fd/Fo,但差别并不重要,通常他们也不会引起Release版错误,在此不讨论)Debug版本:/MDd/MLd或/MTd使用Debugruntimelibrary(调试版本的运行时刻函数库);/Od关闭优化开关;/D"_DEBUG"相当于#define_DEBUG,打开编译调试代码开关(主要针对assert函数);/ZI创建Editandcontinue(编辑继续)数据库,这样在调试过程中如果修改了原始码不需重新编译;/GZ能帮助捕捉内存错误;/Gm打开最小化重链接开关,减少链接时间.
Release版本:/MD/ML或/MT使用发布版本的运行时刻函数库,/O1或/O2优化开关,使程式最小或最快,/D"NDEBUG"关闭条件编译调试代码开关(即不编译assert函数),/GFPDFcreatedwithpdfFactoryProtrialversionwww.
pdffactory.
com合并重复的字符串,并将字符串常量放到只读内存,防止被修改.
实际上,Debug和Release并没有本质的界限,他们只是一组编译选项的集合,编译器只是按照预定的选项行动.
事实上,我们甚至能修改这些选项,从而得到优化过的调试版本或是带跟踪语句的发布版本.
再来逐个对照这些选项看看Release版错误是怎样产生.
runtimelibrary:链接哪种运行时刻函数库通常只对程序的性能产生影响.
调试版本的runtimelibrary包含了调试信息,并采用了一些保护机制以帮助发现错误,因此性能不如发布版本.
编译器提供的runtimelibrary通常很稳定,不会造成release版错误;倒是由于debug的runtimelibrary加强了对错误的检测,如堆内存分配,有时会出现debug有错但release正常的现象.
应当指出的是,如果debug有错,即使release正常,程序肯定是有bug的,只不过可能是release版的某次运行没有表现出来而已.
优化:这是造成错误的主要原因,因为关闭优化时源程序基本上是直接翻译的,而打开优化后编译器会作出一系列假设.
这类错误主要有以下几种:帧指针(framepointer)省略(简称fpo):在函数调用过程中,所有调用信息(返回地址、参数)以及自动变量都是放在栈中的.
若函数的声明与实现不同(参数、返回值、调用方式),就会产生错误.
但debug方式下,栈的访问通过ebp寄存器保存的地址实现,如果没有发生数组越界之类的错误(或是越界"不多"),函数通常能正常执行;release方式下,优化会省略ebp栈基址指针,这样通过一个全局指针访问栈就会造成返回地址错误是程序崩溃.
c++的强类型特性能检查出大多数这样的错误,但如果用了强制类型转换,就不行了.
你可以在release版本中强制加入/oy-编译选项来关掉帧指针省略,以确定是否此类错误.
此类错误通常有:mfc消息响应函数书写错误.
正确的应为afx_msglresultonmessageown(wparamwparam,lparamlparam);on_message宏包含强制类型转换.
防止这种错误的方法之一是重定义on_message宏,把下列代码加到stdafx.
h中(在#include"afxwin.
h"之后),函数原形错误时编译会报错#undefon_message.
#defineon_message(message,memberfxn)\{message,0,0,0,afxsig_lwl,\(afx_pmsg)(afx_pmsgw)(static_cast(&memberfxn)}.
volatile型变量:volatile告诉编译器该变量可能被程序之外的未知方式修改(如系统、其他进程和线程).
优化程序为了使程序性能提高,常把一些变量放在寄存器中(类似于register关键字),而其他进程只能对该变量所在的内存进行修改,而寄存器中的值没变.
如果你的程序是多线程的,或者你发现某个变量的值与预期的不符而你确信已正确的设置PDFcreatedwithpdfFactoryProtrialversionwww.
pdffactory.
com了,则很可能遇到这样的问题.
这种错误有时会表现为程序在最快优化出错而最小优化正常.
把你认为可疑的变量加上volatile试试.
变量优化:优化程序会根据变量的使用情况优化变量.
例如,函数中有一个未被使用的变量,在debug版中它有可能掩盖一个数组越界,而在release版中,这个变量很可能被优化掉,此时数组越界会破坏栈中有用的数据.
当然,实际的情况会比这复杂得多.
与此有关的错误有:非法访问,包括数组越界、指针错误等.
例如voidfn(void){inti;i=1;inta[4];{intj;j=1;}a[-1]=1;//当然错误不会这么明显,例如下标是变量a[4]=1;}j虽然在数组越界时已出了作用域,但其空间并未收回,因而i和j就会掩盖越界.
而release版由于i、j并未其很大作用可能会被优化掉,从而使栈被破坏.
_debug与ndebug:当定义了_debug时,assert()函数会被编译,而ndebug时不被编译.
除此之外,vc++中还有一系列断言宏.
这包括:ANSIC断言voidassert(intexpression);CRuntimeLib断言ASSERT(booleanExpression);_ASSERTE(booleanExpression);MFC断言ASSERT(booleanExpression);VERIFY(booleanExpression);ASSERT_VALID(pObject);ASSERT_KINDOF(classname,pobject);ATL断言ATLASSERT(booleanExpression);此外,TRACE()宏的编译也受_DEBUG控制.
所有这些断言都只在debug版中才被编译,而在release版中被忽略.
唯一的例外是verify().
事实上,这些宏都是调用了assert()函数,只不过附加了一些与库有关的调试代码.
如果你在这些宏中加入了任何程序代码,而不只是布尔表达式(例如赋值、能改变变量值的函数调用等),那么release版都不会执行这些操作,从而造成错误.
初学者很容易犯这类错误,查找的方法也很简单,因为这些宏都已在上面列出,只要利用vc++的findinfiles功能在工程所有文件中找到用这些宏的地方再一一检查即可.
另外,有些高手可能还会加入#ifdef_debug之类的条件编译,也要注意一下.
顺便值得一提的是verify()宏,这个宏允许你将程序代码放在布尔表达式里.
这个宏通常用来检查windowsapi的返回值.
有些人可能为这个原因而滥用verify(),事实上这是危险的,因为verify()违反了断言的思想,不能使程序代码和调试代码完全分离,最终可能会带来很多麻烦.
因此,专家们建议尽量少用这个宏.
/gz选项的作用如下:(1)初始化内存和变量.
包括用0xcc初始化所有自动变量,0xcd(cleareddata)初始化堆中分配的内存(即动态分配的内存,例如new),0xdd(deaddata)填充已被释放的堆内存(例如delete),0xfd(defencdedata)初始化受保护的内存(debug版在动态分配内存的前后加入保护内存以防止越界访问),其中括号中的词是微软建议的助记词.
这样做的好处是这些值都很大,作为指针是不可能的(而且32位系统中指针很少是奇数值,在有PDFcreatedwithpdfFactoryProtrialversionwww.
pdffactory.
com些系统中奇数的指针会产生运行时错误),作为数值也很少遇到,而且这些值也很容易辨认,因此这很有利于在debug版中发现release版才会遇到的错误.
要特别注意的是,很多人认为编译器会用0来初始化变量,这是错误的(而且这样很不利于查找错误).
(2)通过函数指针调用函数时,会通过检查栈指针验证函数调用的匹配性.
(防止原形不匹配)(3)函数返回前检查栈指针,确认未被修改.
(防止越界访问和原形不匹配,与第二项合在一起可大致模拟帧指针省略fpo)通常/gz选项会造成debug版出错而release版正常的现象,因为release版中未初始化的变量是随机的,这有可能使指针指向一个有效地址而掩盖了非法访问.
除此之外,/gm/gf等选项造成错误的情况比较少,而且他们的效果显而易见,比较容易发现.
IAR编译Release方法:通常写程序,调试程序都是在Debug下.
当程序写完后,切换到Release下编译,很多时候,会有一大堆错误.
原因Debug与release设置不一样.
在Debug下写程序的过程中,对debug的设置有改动,而relase的设置没有变.
一个方法可以把debug的设置复制到relase上.
先把Release删除掉,然后以Debug为模板,新建一个Release.
PDFcreatedwithpdfFactoryProtrialversionwww.
pdffactory.
comPDFcreatedwithpdfFactoryProtrialversionwww.
pdffactory.
com
商家介绍:星梦云怎么样,星梦云好不好,资质齐全,IDC/ISP均有,从星梦云这边租的服务器均可以备案,属于一手资源,高防机柜、大带宽、高防IP业务,一手整C IP段,四川电信,星梦云专注四川高防服务器,成都服务器,雅安服务器,。活动优惠促销:1、成都电信夏日激情大宽带活动机(封锁UDP,不可解封):机房CPU内存硬盘带宽IP防护流量原价活动价开通方式成都电信优化线路2vCPU2G40G+60G21...
LOCVPS在农历新年之后新上架了日本大阪机房软银线路VPS主机,基于KVM架构,配备原生IP,适用全场8折优惠码,最低2GB内存套餐优惠后每月仅76元起。LOCVPS是一家成立于2012年的国人VPS服务商,提供中国香港、韩国、美国、日本、新加坡、德国、荷兰、俄罗斯等地区VPS服务器,基于KVM或XEN架构(推荐选择KVM),线路方面均选择国内直连或优化方案,访问延迟低,适合建站或远程办公使用。...
搬瓦工在国内非常流行的主机商,以提供低价的vps著称.不过近几年价格逐渐攀升.不过稳定性和速度一向不错.依然深受国内vps爱好者喜爱.新上线的套餐经常卖到断货.支持支付宝,paypal很方便购买和使用.官网网站:https://www.bandwagonhost.com[不能直接访问,已墙]https://www.bwh88.net[有些地区不能直接访问]https://www.bwh81.net...
css下拉菜单为你推荐
AppleTVapple中国微信5字符串div微信小程序直播功能准入要求文件127支持ipadpublicationethics.orgwin10关闭445端口如何进入注册表修改关闭445端口fusioncharts如何自定义FusionCharts图表上的工具提示?csshackcss中 *bottom是什么意思?
武汉域名注册 域名查询系统 香港vps vps代购 z.com omnis mobaxterm 天猫双十一秒杀 绍兴高防 vip购优汇 isp服务商 qq对话框 网通服务器托管 中国电信宽带测速网 爱奇艺会员免费试用 免费私人服务器 免费邮件服务器 supercache alexa搜 comodo 更多