首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

C++ Builder 5 CodeGuard 完整使用指南:記憶體洩漏、資源檢查、函數驗證

     編輯:VC 教學

前言

CodeGuard 是 BCB5 內建的**運行期錯誤檢測工具**,能捕捉記憶體洩漏、非法指標、雙重釋放、無效句柄、API 參數錯誤等極難靜態發現的問題。本文詳述配置、啟用、報告解讀、進階設定與實戰技巧。

一、CodeGuard 能檢測什麼

  • 非法記憶體釋放(delete 非 new 指標、雙重 delete)
  • 無效句柄/檔案流操作
  • 野指標/懸空指標存取
  • 已釋放記憶體的後續使用
  • 記憶體洩漏(未釋放的 new/malloc/GlobalAlloc 等)
  • API 參數錯誤(VCL/Win32 函數傳入無效指標、錯誤旗標)
  • API 返回值錯誤(忽略失敗碼、錯誤處理不當)

二、啟用與專案設定

  1. Project → Options → Compiler:選擇 Release 配置(或 Debug),確保優化不影響檢測。
  2. Project → Options → Packages:取消勾選 "Build with runtime packages"(否則 CodeGuard 無法檢測包內記憶體)。
  3. Project → Options → Linker:取消勾選 "Use dynamic RTL"(靜態連結 RTL,便於檢測)。
  4. Project → Options → CodeGuard:勾選 "CodeGuard Validation",下方三項全開:
    • 檢查區域/靜態變數指標溢位
    • 檢測非法物件方法呼叫
    • 驗證內嵌指標存取(可能降低速度,小專案可接受)
  5. 完全重新建置(關鍵):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)。謹慎使用,可能漏報真錯誤。

四、實戰工作流

  1. 開啟 CodeGuard,Build All。
  2. 在 IDE 中運行(F9),進行功能測試、壓力測試、邊界操作。
  3. 關閉程式,查看 **CodeGuard Report 視窗**(View → Debug Windows → CodeGuard Report)或日誌檔(專案目錄 *.cgl)。
  4. 重點關注:
    • Memory Leaks:列出未釋放區塊、大小、分配堆疊(雙擊跳轉代碼)。
    • Invalid Pointer Operations:野指標、雙重釋放、越界。
    • API Errors:參數無效、返回值未檢查。
    • Resource Leaks:CreatePen 未 DeleteObject、CreateThread 未 CloseHandle 等。
  5. 修復錯誤,重複測試直到報告乾淨。

五、進階技巧

  • 條件式編譯:#ifdef USE_CODEGUARD 區隔啟用代碼,發布版排除。
  • 自定義分配器追蹤:重載 new/delete 或使用 CodeGuard API (CG_RegisterAlloc 等) 納入自定義記憶體池。
  • 多執行緒檢測:CodeGuard 5 支援多執行緒,但高併發下可能誤報/漏報,建議單執行緒壓測驗證核心邏輯。
  • 結合 Purify/BoundsChecker:CodeGuard 輕量易用,大型專案建議配合商業級工具深度檢測。

六、常見誤區

  1. 只在 Debug 開啟:Release 模式優化可能隱藏錯誤,**必須在目標發布配置下測試**。
  2. 動態包/動態 RTL 導致檢測失效:記住兩個「取消勾選」。
  3. 忘記 Build All:修改設定後未重建,插桿代碼未更新。
  4. 忽略「Resource Leaks」:GDI/USER 物件洩漏導致系統資源耗盡,嚴重性不亞於記憶體洩漏。

七、總結

CodeGuard 是 BCB 開發者的**免費利器**,幾分鐘配置即可自動捕捉 80%+ 運行期記憶體/資源錯誤。養成「每次發布前跑一輪 CodeGuard」習慣,能大幅降低線上 Crash、資源耗盡、詳細異常的風險。BCB6 及後續版本同樣內建,升級專案時別遺漏此設定。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved