Debug 版運行正常,Release 版崩潰或邏輯錯誤,且 Release 無法直接調試。
| 項目 | Debug | Release |
|---|---|---|
| 執行期庫 | /MDd /MTd /MLd (Debug CRT) | /MD /MT /ML (Release CRT) |
| 優化 | /Od (關閉) | /O1 或 /O2 (速度/大小優化) |
| 調試資訊 | /ZI (Edit & Continue) | 無 |
| _DEBUG 宏 | 定義 | 未定義 (定義 NDEBUG) |
| 字串合併 | 否 | /GF (合併唯讀) |
| 記憶體填充 | 0xCC (int 3 中斷指令) | 不初始化 (隨機殘值) |
Debug 下自動填 0xCC,Release 下殘值隨機。對策:宣告即初始化,尤其指標、陣列、控制變數。
錯誤:afx_msg LRESULT OnMyMsg(); → Release 下參數傳遞錯位導致無效控制代碼。
正確:afx_msg LRESULT OnMyMsg(WPARAM w, LPARAM l);
ASSERT(expr):Debug 執行,Release 空展開 → 若 expr 有副作用(如 i++)Release 會漏執行VERIFY(expr):兩者皆執行 expr,僅 Debug 檢查結果TRACE:Debug 輸出,Release 無操作原則:斷言/追蹤宏內勿放程式邏輯相關運算。
Debug CRT 在堆疊/堆周圍放置守護頁,掩蓋越界。Release 直接觸發存取違規。
對策:善用 ASSERT_POINTER、BoundsChecker、Application Verifier。
printf/TRACE 至檔案定位崩潰行/Od) 逐步縮小範圍/Zi) 並生成 .pdb,Release 也能連結調試器_DEBUG 區塊內的邏輯差異try/catch(...) 保護邊界