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函數調用,出現在多個函數層層調用
 
總結

總結到就這么
 

 

 

        





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM