错误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

PacificRack(年付低至19美元),夏季促销PR-M系列和多IP站群VPS主机

这几天有几个网友询问到是否有Windows VPS主机便宜的VPS主机商。原本他们是在Linode、Vultr主机商挂载DD安装Windows系统的,有的商家支持自定义WIN镜像,但是这些操作起来特别效率低下,每次安装一个Windows系统需要一两个小时,所以如果能找到比较合适的自带Windows系统的服务器那最好不过。这不看到PacificRack商家有提供夏季促销活动,其中包括年付便宜套餐的P...

一键去除宝塔面板各种计算题与延时等待

现在宝塔面板真的是越来越过分了,删除文件、删除数据库、删除站点等操作都需要做计算题!我今天升级到7.7版本,发现删除数据库竟然还加了几秒的延时等待,也无法跳过!宝塔的老板该不会是小学数学老师吧,那么喜欢让我们做计算题!因此我写了个js用于去除各种计算题以及延时等待,同时还去除了软件列表页面的bt企业版广告。只需要执行以下命令即可一键完成!复制以下命令在SSH界面执行:Layout_file="/w...

月神科技:香港CN2/洛杉矶CN2/华中电信高防vps,月付20元起

月神科技怎么样?月神科技是由江西月神科技有限公司运营的一家自营云产品的IDC服务商,提供香港安畅、香港沙田、美国CERA、华中电信等机房资源,月神科技有自己的用户群和拥有创宇认证,并且也有电商企业将业务架设在月神科技的平台上。目前,香港CN2云服务器、洛杉矶CN2云主机、华中电信高防vps,月付20元起。点击进入:月神科技官方网站地址月神科技vps优惠信息:香港安畅CN2-GIA低至20元核心:2...

css下拉菜单为你推荐
practicescss请务必阅读正文之后的免责条款部分css3圆角怎样用css实现圆角矩形?netbios端口如何组织netbios端口的外部通信ipadwifiipad wifi信号差怎么办重庆电信宽带测速重庆电信光纤宽带网络,内外网络和电脑等设备都没发生变化的情况下,办理了从20M提速到100M业务。联通iphone4iphone4想换联通的卡 是普通联通的卡都能开通3G么 还是得换联通3G卡 联通都有什么套餐 我是北京的win7关闭135端口windows 7如何关闭139端口googleadsensegoogle adsense 和google adwords有什么区别?适合什么样的人群?googleadsenceGoogle AdSense 帐户状态是什么意思!
最好的虚拟主机 重庆服务器托管 hostgator stablehost 私人服务器 cloudstack lamp配置 搜狗12306抢票助手 ibox官网 百兆独享 域名和空间 最好的qq空间 登陆空间 宏讯 cdn服务 万网服务器 google搜索打不开 沈阳idc 学生机 美国十大啦 更多