開發過程中過半時間用於除錯。VC++ 提供強大的中斷點、單步執行、變數監視視窗,但盲目單步極耗時。本文總結中斷點設置策略、監視視窗技巧,並詳細說明 `TRACE` 宏在 Debug 版本輸出追蹤資訊的用法與格式化技巧。
| 位置 | 目的 |
|---|---|
| 判斷式之前 | 觀察條件變數是否正確 |
| 函數入口 | 檢查參數、成員變數初始狀態 |
| 函數出口 | 驗證返回值、輸出參數、狀態變更 |
| 呼叫其他函數前/後 | 黑盒測試:驗證被呼叫函數副作用 |
| 迴圈前幾次 | 驗證迴圈邏輯、累積變數,確認後移除中斷點 |
操作:F9 切換中斷點,F5 開始除錯,F10 逐過,F11 逐入,Shift+F11 逐出。
定義:`TRACE(exp)`,`exp` 格式同 `printf`。僅在 **Debug 版本** 編譯生效,Release 版本自動消失。
int i = 5, j = 50;
char sz[] = "debug string";
TRACE(_T("trace i=%d j=%d string=%s\n"), i, j, sz);
// 輸出至「輸出」視窗 Debug 頁籤
int Recursive(int n, int depth = 0) {
CString indent(' ', depth * 2);
TRACE(_T("%sRecursive(%d) depth=%d\n"), indent, n, depth);
if (n <= 1) return 1;
return n * Recursive(n - 1, depth + 1);
}
輸出視窗將顯示縮排的呼叫堆疊,直觀呈現遞歸深度。