1. 程式人生 > >Visual Studio中Debug和Release

Visual Studio中Debug和Release

概念

Debug通常稱為除錯版本,它包含除錯資訊,並且不作任何優化,便於程式設計師除錯程式。
Release稱為釋出版本,它往往是進行了各種優化,使得程式在程式碼大小和執行速度上都是最優的,以便使用者很好地使用。

Debug模式下的命令列

其各個命令的含義在VS中C++設定中可以看到。

/GS 
/W3 
/Zc:wchar_t 
/I"F:\MusicProjAddLutSingleImage\MusicEffect\..\header" 
/I"F:\MusicProjAddLutSingleImage\MusicEffect\..\header\grender" 
/I"F:\MusicProjAddLutSingleImage
\MusicEffect\..\src\app" /I"F:\MusicProjAddLutSingleImage\MusicEffect\..\src\gmath" /I"F:\MusicProjAddLutSingleImage\MusicEffect\..\src" /ZI /Gm /Od /sdl /Fd"F:\MusicProjAddLutSingleImage\MusicEffect\..\temp\MusicEffect\x64\Debug\vc140.pdb" /Zc:inline /fp:precise /D "_MBCS" /errorReport:prompt /WX- /Zc:forScope /RTC1 /Gd /MDd /Fa"F:\MusicProjAddLutSingleImage
\MusicEffect\..\temp\MusicEffect\x64\Debug\" /EHsc /nologo /Fo"F:\MusicProjAddLutSingleImage\MusicEffect\..\temp\MusicEffect\x64\Debug\" /Fp"F:\MusicProjAddLutSingleImage\MusicEffect\..\temp\MusicEffect\x64\Debug\MusicEffect.pch"

Release模式下的命令列

/GS 
/GL 
/W3 
/Gy 
/Zc:wchar_t 
/Zi 
/Gm- 
/O2 
/sdl 
/Fd"F:\MusicProjAddLutSingleImage
\MusicEffect\..\temp\MusicEffect\x64\Release\vc140.pdb" /Zc:inline /fp:precise /D "_MBCS" /errorReport:prompt /WX- /Zc:forScope /Gd /Oi /MD /Fa"F:\MusicProjAddLutSingleImage\MusicEffect\..\temp\MusicEffect\x64\Release\" /EHsc /nologo /Fo"F:\MusicProjAddLutSingleImage\MusicEffect\..\temp\MusicEffect\x64\Release\" /Fp"F:\MusicProjAddLutSingleImage\MusicEffect\..\temp\MusicEffect\x64\Release\MusicEffect.pch"

兩個命令的不同處

  • Release GL
    • 全程式優化開啟
  • Release下/Gy
    • 啟用函式級連結開啟
  • Debug下ZI Release下Zi
    • ZI 除錯資訊格式:用於程式設計並繼續的程式資料庫
    • Zi 除錯資訊格式:程式資料庫
  • Debug下GM Release下Gm-
    • GM 啟用最小重新生成
    • Gm- 不啟用最小重新生成
  • Debug下OD Release下O2
    • OD 禁用優化
    • O2 使速度最大化
  • Debug下 RTC1
    • RTC1 基本執行時檢查:堆疊幀 未初始化的變數
  • Release下Oi
    • Oi 啟用內部函式
  • Debug下MDd Release下MD
    • MDd 執行庫:多執行緒除錯
    • MD 執行庫:多執行緒DLL

例子:初始化變數

debug跟release在初始化變數時所做的操作是不同的。
- debug是將每個位元組位都賦成0xcc
- release的賦值近似於隨機

例子: 記憶體分配方式

DEBUG版和RELEASE版的記憶體分配方式是不同的。

  • 如果你在DEBUG版中申請 ele6*sizeof(DWORD)=24bytes,實際上分配給你的是32bytesdebug版以32bytes為單位)。
  • 而在release版,分配給你的就是24bytes(r**elease版以8bytes為單位**)。

所以在debug版中如果你寫ele[6],可能不會有 什麼問題,而在release版中,就有ACCESS VIOLATE。

例子:ASSERT除錯巨集

一些程式碼在Release模式下不會報錯,但在Debug模式下會報錯,這是因為Debug模式相當於在編譯程式的時候定義了一個巨集:#define _DEBUG。在Release模式下定義了一個巨集:#define NDEBUG
比如我們來看assert函式的實現

#undef assert

#ifdef NDEBUG

    #define assert(expression) ((void)0)

#else

    _ACRTIMP void __cdecl _wassert(
        _In_z_ wchar_t const* _Message,
        _In_z_ wchar_t const* _File,
        _In_   unsigned       _Line
        );

    #define assert(expression) (void)(                                                       \
            (!!(expression)) ||                                                              \
            (_wassert(_CRT_WIDE(#expression), _CRT_WIDE(__FILE__), (unsigned)(__LINE__)), 0) \
        )

#endif

當定義了巨集NDEBUG之後,assert函式是不起作用的。

總結

實際上,Debug和 Release 並沒有本質的界限,他們只是一組編譯選項的集合,編譯器只是按照預定的選項行動。