POPTEST老李谈Debug和Release的区别(c#)2
二、哪些情况下 Release 版会出错
有了上面的介绍,我们再来逐个对照这些选项看看 Release 版错误是怎样产生的
1. Runtime Library:
2. 优化:这类错误主要有以下几种:
(1) 帧指针(Frame Pointer)省略(简称 FPO ):在函数调用过程中,所有调用信息
(返回地址、参数)以及自动变量都是放在栈中的。若函数的声明与实现不同(参数、返
回值、调用方式),就会产生错误————但 Debug 方式下,栈的访问通过 EBP 寄存器
保存的地址实现,如果没有发生数组越界之类的错误(或是越界“不多”),函数通常能
正常执行;Release 方式下,优化会省略 EBP 栈基址指针,这样通过一个全局指针访问栈
就会造成返回地址错误是程序崩溃。C++ 的强类型特性能检查出大多数这样的错误,但如
果用了强制类型转换,就不行了。你可以在 Release 版本中强制加入 /Oy- 编译选项来关
掉帧指针省略,以确定是否此类错误。
(2) volatile 型变量:volatile 告诉编译器该变量可能被程序之外的未知方式修改
(如系统、其他进程和线程)。
(3) 变量优化:优化程序会根据变量的使用情况优化变量。例如,函数中有一个未被
使用的变量,在 Debug 版中它有可能掩盖一个数组越界,而在 Release 版中,这个变量
很可能被优化调,此时数组越界会破坏栈中有用的数据。当然,实际的情况会比这复杂得
多。与此有关的错误有:
3. _DEBUG 与 NDEBUG :当定义了 _DEBUG 时,assert() 函数会被编译,而 NDEBUG 时不
被编译。除此之外,VC++中还有一系列断言宏。这包括:
ANSI C 断言 void assert(int expression );
C Runtime Lib 断言 _ASSERT( booleanExpression );
_ASSERTE( booleanExpression );
MFC 断言 ASSERT( booleanExpression );
VERIFY( booleanExpression );
ASSERT_VALID( pObject );
ASSERT_KINDOF( classname, pobject );
ATL 断言 ATLASSERT( booleanExpression );
此外,TRACE() 宏的编译也受 _DEBUG 控制。
4. /GZ 选项:这个选项会做以下这些事
(1) 初始化内存和变量。
(2) 通过函数指针调用函数时,会通过检查栈指针验证函数调用的匹配性。(防止原
形不匹配)
(3) 函数返回前检查栈指针,确认未被修改.
三、怎样“调试” Release 版的程序
1. 前面已经提过,Debug 和 Release 只是一组编译选项的差别,实际上并没有什么
定义能区分二者。我们可以修改 Release 版的编译选项来缩小错误范围。如上所述,可以
把 Release 的选项逐个改为与之相对的 Debug 选项,如 /MD 改为 /MDd、/O1 改为 /Od
,或运行时间优化改为程序大小优化。注意,一次只改一个选项,看改哪个选项时错误消
失,再对应该选项相关的错误,针对性地查找。这些选项在 Project\Settings... 中都可
以直接通过列表选取,通常不要手动修改。由于以上的分析已相当全面,这个方法是最有
效的。
2.你也可以像 Debug 一样调试你的 Release 版,只要加入调试符号。在 Project/S
ettings... 中,选中 Settings for "Win32 Release",选中 C/C++ 标签,Category 选
General,Debug Info 选 Program Database。再在 Link 标签 Project options 最后
加上 "/OPT:REF" (引号不要输)。
POPTEST老李谈Debug和Release的区别(c#)2的更多相关文章
- POPTEST老李谈Debug和Release的区别(c#)
POPTEST老李谈Debug和Release的区别(c#) poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣 ...
- POPTEST老李谈Debug和Release的区别(c#) 1
POPTEST老李谈Debug和Release的区别(c#) poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣 ...
- POPTEST老李谈JVM、JRE、JDK、java ee sdk with jdk区别
POPTEST老李谈JVM.JRE.JDK.java ee sdk with jdk区别 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等 ...
- 关于VS项目平台的x86,x64,Any CPU以及Debug和Release的区别
相信对于很多刚接触打包程序的同志来说,关于x86,x64,Any CPU这三个项目平台,以及解决方案配置Debug和Release有什么区别?这个问题一定有许多的困惑,甚至不乏一些已经工作了很久的老程 ...
- C++中debug和release的区别 . 转载
vc中debug和release的不同 收藏 在使用VC开发软件的过程中,正当要享受那种兴奋的时候突然发现:release与debug运行结果不一致,甚至出错,而release又不方便调试,真的是当 ...
- poptest老李谈数据库优化总结
poptest老李谈数据库优化总结 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:9088 ...
- poptest老李谈动态口令原理
poptest老李谈动态口令原理 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:908 ...
- poptest老李谈分布式与集群 1
poptest老李谈分布式与集群 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:90882 ...
- poptest老李谈jvm的GC
poptest老李谈jvm的GC poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:90882 ...
随机推荐
- [2017.02.21] 《Haskell趣学指南 —— Learning You a Haskell for Great Good!》
{- 2017.02.21 <Haskell趣学指南 -- Learning You a Haskell for Great Good!> [官网](http://learnyouahas ...
- linux下php调试工具xdebug安装配置
xdebug简介 Xdebug是php的一款调试工具,是基于zend的一个扩展,可以用来跟踪,调试和分析PHP程序的运行状况.如变量,函数调试,性能监测,代码覆盖率等 xdebug安装 1.下载xde ...
- 2017-2-19 C#基础 基本数据类型的转换,转义字符,常量
1.基本数据类型的转换分两种:自动转换(隐式转换)和强制转换(显式转换).自动转换是从只类型转换到引用类型.强制转换是最长用的,是从引用类型转换到值类型或者从浮点型转换到整形.强制转换主要有三种形式: ...
- JS高级程序设计学习笔记——继承
我们知道,在OO语言中,继承可分为接口继承和实现继承.而ECMAScript的函数没有签名,不能实现“接口继承”,只能通过原型链实现“实现继承”. 在学习了各种继承模式之后,简单总结一下各种继承模式的 ...
- 转:常用的iOS开源库和第三方组件
1.通过CocoaPods安装:
- php审核操作
注册页面zhuce.php <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http ...
- hibernate中一种导致a different object with the same identifier value was already associated with the session错误方式及解决方法
先将自己出现错误的全部代码都贴出来: hibernate.cfg.xml <?xml version="1.0" encoding="UTF-8"?> ...
- 从源码解析TreeMap
上篇文章我们介绍了HashMap集合,这是一个键值对集合,可以高效的按照键查找数值.但是它有一个缺陷:数据如果是无序的可以是很高效的,但是如果数据需要排列有顺序就不适合了.本篇将要介绍的一个集合是树集 ...
- Chosen通用初始化
一直在用Chosen这个js插件,其目的就是美化下拉框.github地址:https://harvesthq.github.io/chosen/ no_results_text:"xxxxx ...
- Insertion Sort List Leetcode
Sort a linked list using insertion sort. 这个题我巧妙的设置了一个临时头结点 class Solution { public: ListNode* insert ...