Debug版本和Relase版本比较

Posted 康小泡

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Debug版本和Relase版本比较相关的知识,希望对你有一定的参考价值。

前言

一直知道有存在Debug版和Relase版,一直不是特别清楚两者到底存在什么样的本质的差别,所以在这里做一个比较,这里以HellWorld代码为例。
代码:
  1. #include <Windows.h>
  2. #include <tchar.h>
  3. int _tmain(int argc, TCHAR *argv[]){
  4. MessageBox(NULL, L"Have a test", L"OK", MB_OK);
  5. return 0;
  6. }

一、大小

两者的大小存在实质上的差别,两者之间的大小存在很大差异。可以看到Debug版本的大小快是release版本的5倍了,那么到底是什么导致release比Dbueg版本小这么多呢?
  •  debug版本,通常也称为调试版本,编译结果包含调试信息,而且不做任何优化,为开发人员提供强大的应用成虚调试功能
  • release版本,通常也称为发布版本,不保存调试信息,并且进行了各种优化,以达到大妈最小和速度最优。

很多朋友又想问了,那么调试信息又是写什么信息呢?release做了优化,又优化了些什么呢?
  • 调试信息
比如,在调试你的代码的时候,你会下一个断点,那么调试器如何知道你下了一个断点呢?也就是我们的调试信息会告知调试器的啦。平时调试的时候我们还会去看一下变量的值是否是我们预期的那么多,这里也是调试器通过调试信息找到该变量的值并展示出来。想要知道更多关于调试信息的只是,可以看看编译原理相关的东西,立面讲的更加的详细
  • release优化
    1. 首当其冲的应该就是调试信息啦,release不包含调试信息
    2. 对变量的优化,Debug版本如果不对变量进行初始化,变量自动初始化为0XCC,删除动态分配的内存时将其赋值为0XCD。Release版本不对变量进行初始化,删除动态分配内存的时候也不对内存中的数据进行处理
    3. 内存分配长度的处理,Debug版本分配字节以32bytes为单位,release则是以8bytes为单位。比如定义Int num[4],在Debug版本里面能分配到的内存长度是32byte,但是在Release版本里面就只能分配到16byte                
    4. Release版本里对于经常使用的变量会自动使其变成寄存器变量,加快程序运行速度
    5. 编译后的程序,Debug版本包含了源代码以方便调试,但是Release不包含。
关于Debug的调试信息和Release的优化还有很多地方没有讲到,这里只说个大概,让大家大概知道这两个的概念,确定这两个到底是做什么的。
二、节

如下图所示,Debug版本比Release版本多了两个节,.textbss和.idata两个节下面我们就来说说这两个节吧
  •  .textbss   为增量链接和动态编译服务,禁用增量链接会导致动态编译功能不可再用,这里没有使用动态链接来加载函数,被Release版本给优化了
  • .idata 包含其他外来DLL的函数技术局信息,即输入表,将idata区块合并到另外一个区块现在已成为了惯例,典型的是.rdata区块,默认地,连接器仅在创建你一个Release模式的可知行文件时才将.idata 合并到另外一个区域

三、IDA反编译

  • Release版本比较简洁,直接就是一个函数调用没有其他的多余的附加信息
  • Debug版本便复杂了很多,包含了很多调试器的信息以及一些系统函数的调用。一个简单的MessageBoxW函数调用,出现在多个函数层层调用
 
总结

总结到就这么
 

 

 

        




以上是关于Debug版本和Relase版本比较的主要内容,如果未能解决你的问题,请参考以下文章

VS2015编译GEOS的debug和release版本

debug和release版本的区别

在 ASP.Net 中发布到生产环境

嵌入式开发 | 软件项目中 Debug 和 Release 版本的差异

嵌入式开发 | 软件项目中 Debug 和 Release 版本的差异

mfc 程序,debug版本正常和release版本异常。