| 選項 | Debug | Release |
|---|---|---|
| 執行期庫 | /MDd /MTd /MLd | /MD /MT /ML |
| 優化 | /Od (關閉) | /O1 (小) /O2 (快) |
| 調試資訊 | /ZI (Edit & Continue) | /Zi 或無 |
| _DEBUG 宏 | 定義 | 未定義 (定義 NDEBUG) |
| 字串合併 | 否 | /GF |
| 記憶體填充 | 0xCC (int 3) | 不初始化 (隨機) |
| 斷言宏 | ASSERT 執行 | ASSERT 空展開 |
Debug 自動填 0xCC (觸發中斷或可預測值),Release 殘值隨機。
鐵律:宣告即初始化 int n=0; int* p=NULL; int arr[10]={0};
// 錯誤
afx_msg LRESULT OnMyMsg();
// 正確
afx_msg LRESULT OnMyMsg(WPARAM w, LPARAM l);
Release 下參數對齊嚴格,缺參導致堆疊破壞、無效控制代碼。
ASSERT(i++ > 0) → Release 不執行 i++ → 邏輯錯誤VERIFY(ptr = new Obj) → 兩者皆執行分配,僅 Debug 檢查結果TRACE → Release 完全移除原則:斷言/追蹤宏內絕無程式邏輯副作用。
Debug CRT 在配置塊前後放置守護帶,掩蓋越界寫入。Release 直接觸發 Access Violation。
工具:Application Verifier、PageHeap、BoundsChecker、VS 內建 /RTC (僅 Debug)。
/Od 關閉優化,保留 Release 執行期庫/DEBUG 生成 .pdbprintf/OutputDebugString 輸出關鍵變數至檔案/偵錯視窗std::vector/CString)try/catch(...) 保護外部呼叫Debug/Release 差異本質是編譯選項集合不同,99% 的「Release 才出錯」歸因於程式碼本身缺陷被 Debug 環境掩蓋。養成「零容忍」編碼習慣,配合靜態分析 (/analyze) 與 Runtime 檢測工具,才能交付穩健的 Release 版本。