前言
CodeGuard 是 BCB5 內建的**運行期錯誤檢測工具**,能捕捉記憶體洩漏、非法指標、雙重釋放、無效句柄、API 參數錯誤等極難靜態發現的問題。本文詳述配置、啟用、報告解讀、進階設定與實戰技巧。
一、CodeGuard 能檢測什麼
- 非法記憶體釋放(
delete 非 new 指標、雙重 delete)
- 無效句柄/檔案流操作
- 野指標/懸空指標存取
- 已釋放記憶體的後續使用
- 記憶體洩漏(未釋放的
new/malloc/GlobalAlloc 等)
- API 參數錯誤(VCL/Win32 函數傳入無效指標、錯誤旗標)
- API 返回值錯誤(忽略失敗碼、錯誤處理不當)
二、啟用與專案設定
- Project → Options → Compiler:選擇 Release 配置(或 Debug),確保優化不影響檢測。
- Project → Options → Packages:取消勾選 "Build with runtime packages"(否則 CodeGuard 無法檢測包內記憶體)。
- Project → Options → Linker:取消勾選 "Use dynamic RTL"(靜態連結 RTL,便於檢測)。
- Project → Options → CodeGuard:勾選 "CodeGuard Validation",下方三項全開:
- 檢查區域/靜態變數指標溢位
- 檢測非法物件方法呼叫
- 驗證內嵌指標存取(可能降低速度,小專案可接受)
- 完全重新建置(關鍵):CodeGuard 需插桿代碼,任何設定變更必須 Build All。
三、CodeGuard 設定工具 (CGCONFIG.EXE)
命令列執行 CGCONFIG.EXE 開啟圖形介面:
Preferences 分頁
- Enable:全域啟用/停用(不重編即時生效,建議改用專案設定控制)。
- Stack fill frequency:堆疊填充頻率(檢測堆疊溢位/未初始化變數)。
- Report:輸出統計表(配置/釋放統計、API 呼叫、資源使用、模組清單)。
- Resource Leaks:程式結束時回報資源洩漏(GDI、USER、Kernel 物件)。
- Error Message Box:IDE 外運行時彈窗顯示錯誤(發布測試用)。
Resource Options / Function Options
- 可針對特定資源類型(記憶體、GDI、USER、Kernel)、檔案、函數啟用/停用追蹤。
- 常用:**Function Options 勾選特定函數 "Log every call"**,追蹤可疑函數呼叫堆疊。
Ignored Modules
- 排除特定 DLL/BPL 的檢測(如第三方庫誤報、系統 DLL)。謹慎使用,可能漏報真錯誤。
四、實戰工作流
- 開啟 CodeGuard,Build All。
- 在 IDE 中運行(F9),進行功能測試、壓力測試、邊界操作。
- 關閉程式,查看 **CodeGuard Report 視窗**(View → Debug Windows → CodeGuard Report)或日誌檔(專案目錄
*.cgl)。
- 重點關注:
- Memory Leaks:列出未釋放區塊、大小、分配堆疊(雙擊跳轉代碼)。
- Invalid Pointer Operations:野指標、雙重釋放、越界。
- API Errors:參數無效、返回值未檢查。
- Resource Leaks:
CreatePen 未 DeleteObject、CreateThread 未 CloseHandle 等。
- 修復錯誤,重複測試直到報告乾淨。
五、進階技巧
- 條件式編譯:
#ifdef USE_CODEGUARD 區隔啟用代碼,發布版排除。
- 自定義分配器追蹤:重載
new/delete 或使用 CodeGuard API (CG_RegisterAlloc 等) 納入自定義記憶體池。
- 多執行緒檢測:CodeGuard 5 支援多執行緒,但高併發下可能誤報/漏報,建議單執行緒壓測驗證核心邏輯。
- 結合 Purify/BoundsChecker:CodeGuard 輕量易用,大型專案建議配合商業級工具深度檢測。
六、常見誤區
- 只在 Debug 開啟:Release 模式優化可能隱藏錯誤,**必須在目標發布配置下測試**。
- 動態包/動態 RTL 導致檢測失效:記住兩個「取消勾選」。
- 忘記 Build All:修改設定後未重建,插桿代碼未更新。
- 忽略「Resource Leaks」:GDI/USER 物件洩漏導致系統資源耗盡,嚴重性不亞於記憶體洩漏。
七、總結
CodeGuard 是 BCB 開發者的**免費利器**,幾分鐘配置即可自動捕捉 80%+ 運行期記憶體/資源錯誤。養成「每次發布前跑一輪 CodeGuard」習慣,能大幅降低線上 Crash、資源耗盡、詳細異常的風險。BCB6 及後續版本同樣內建,升級專案時別遺漏此設定。