除錯前置準備:專案選項完整設定
Compiler(編譯器)分頁
- 點選 Full debug(完全除錯模式)— 自動啟用多數所需設定
- Code optimization = None:防止編譯器優化改變程式碼結構,確保原始碼與機器碼一一對應
- Debug information = On、Line number information = On:產生行號對應資訊
- Disable inline expansions = On:關閉內聯展開,避免單步進入內聯函數造成困擾
Linker(連結器)分頁
- Create debug information = On:產生連結器層級除錯資訊
- Use dynamic RTL:動態 RTL 有爭議,除錯建議關閉(靜態連結)
- Don't generate state files = Off:啟用狀態檔加速增量連結(會產生大暫存檔)
Directories/Conditionals 分頁
- Debug source path = $(BCB)\source\vcl:可單步進入 VCL 原始碼
- 第三方元件路徑同步加入(分號分隔)
Packages(套件)分頁 — 關鍵設定
- Build with runtime packages = Off(除錯時必須關閉)
- 原因:執行套件不含除錯資訊,會導致除錯器將錯誤誤判為 VCL 內部問題
- 發布正式版時再決定是否啟用
Debugger Options 對話框
- Integrated debugging = On:啟用整合式除錯器
重新完整建置
修改設定後執行 Project | Build All 確保所有單元依新設定編譯。
斷點完整操作指南
基本斷點
- 程式碼編輯器左側灰槽點擊 → 紅點出現,該行變紅
- 程式執行至此暫停,控制權回傳除錯器
條件斷點
- 紅點右鍵 → Breakpoint Properties
- Condition:輸入運算式(如
x > 10 && y == 0),變數必須在當前作用域可見
- Pass Count:略過 N-1 次,第 N 次命中才中斷
- 兩者可組合使用
例外中斷
- 例外發生時自動在拋出行顯示斷點
- 後續可用 Call Stack 回溯尋找真正原因
斷點狀態圖示
| 圖示 | 含義 |
| 紅點 | 啟用、有效斷點 |
| 紅點 + 黃叉 | 無效斷點(該行無機器碼,如註解、宣告) |
| 紅點 + 綠勾 | 已驗證有效(執行時動態更新) |
變數檢視三大工具
1. Local Variables(區域變數視窗)
View | Debug Windows | Local Variables 或 Ctrl+Alt+L
- 自動顯示當前函數所有區域變數,單步時動態更新
2. Watches(觀察視窗)
View | Debug Windows | Watches 或 Ctrl+Alt+W
- 加入方式:程式碼選取變數/運算式 → 右鍵
Debug | Add Watch at Cursor 或 Ctrl+F5
- 支援運算式求值:
(i*j)+5、SomeVector[i].Name
- 進階欄位:
- Repeat count:陣列展開(如
arr + count=50 → 顯示 arr[0]..arr[49])
- Digits:浮點數小數位數
- 顯示格式:十六進位、二進位等強制轉換
- 右鍵 Break When Changed:資料變更中斷(資料觀察點)
3. Inspectors(巡視器/偵測器)
- Local Variables 視窗雙擊變數,或程式碼右鍵
Inspect
- 顯示完整物件結構:Data(資料)、Methods(方法)、Properties(屬性)
- 即時修改值:雙擊數值欄位直接編輯(謹慎使用)
- 屬性欄位顯示
{read=, write=} 時,點擊 ? 按鈕可強制讀取
- 巢狀巡視:雙擊成員開啟子巡視器
- Descend(繼承):右鍵切換至基類/衍生類視圖,下拉清單快速切換
- ⚠ 離開作用域會失效,需重新開啟
Evaluate/Modify(運算式求值/修改)
- 程式碼右鍵
Debug | Evaluate/Modify
- 最適合**臨時修改變數值**測試不同分支
- 功能與 Watch/Inspector 重疊,但修改介面最直觀
單步執行五大模式
| 指令 | 熱鍵 | 行為 | 適用場景 |
| Step Over | F8 | 執行當前行,函數呼叫視為單步(不進入) | 確信被呼叫函數無誤 |
| Trace Into | F7 | 進入函數內部(含隱含屬性存取) | 需檢視函數內部邏輯 |
| Trace to Next Source Line | Shift+F7 | 執行至下一行有原始碼行 | API 回呼函數中斷 |
| Run to Cursor | F4 | 執行至游標所在行 | 快速跳過大段程式碼 |
| Run Until Return | Shift+F8 | 執行至當前函數返回 | 跳出深層巢狀/迴圈 |
額外控制
- Program Reset (Ctrl+F2):強制終止,**慎用**— 資源不釋放,資料庫連線會耗盡
- Run (F9):全速執行至下一斷點或例外
單步執行註記
- 所有單步模式**均會檢查斷點條件**,滿足則中斷
- 例外發生**立即中斷**,不受單步模式影響
- 變數視窗**動態更新**,單步時自動重新求值
- 上一篇文章: 程式開發 24 條鐵律:從錯誤處理、文件先行到優化策略與專案管理
- 下一篇文章: 掌握 C++Builder 除錯藝術(二·下):Call Stack、CPU 視窗、除錯版面與實戰心法
Copyright ©
程式碼之家 All Rights Reserved