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

VC++ 除錯技巧:中斷點策略與 TRACE 宏輸出中間過程

     編輯:關於C語言

開發過程中過半時間用於除錯。VC++ 提供強大的中斷點、單步執行、變數監視視窗,但盲目單步極耗時。本文總結中斷點設置策略、監視視窗技巧,並詳細說明 `TRACE` 宏在 Debug 版本輸出追蹤資訊的用法與格式化技巧。

中斷點設置策略

位置目的
判斷式之前觀察條件變數是否正確
函數入口檢查參數、成員變數初始狀態
函數出口驗證返回值、輸出參數、狀態變更
呼叫其他函數前/後黑盒測試:驗證被呼叫函數副作用
迴圈前幾次驗證迴圈邏輯、累積變數,確認後移除中斷點

操作:F9 切換中斷點,F5 開始除錯,F10 逐過,F11 逐入,Shift+F11 逐出。

變數監視視窗

  • Variables (自動/區域):顯示當前堆疊幀區域變數
  • Watch (監視):手動輸入變數名/運算式(含全域、成員 `this->m_x`),值變更時顯示紅色
  • Memory (記憶體):檢視原始位元組
  • Registers (暫存器):EAX, ECX, EBP, ESP 等

TRACE 宏:printf 風格的除錯輸出

定義:`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 頁籤

進階技巧

  • 條件輸出:`if (cond) TRACE(...)`
  • 格式化指標:`TRACE(_T("ptr=0x%08X\n"), ptr)`
  • 寬字串:`TRACE(_T("str=%s\n"), (LPCTSTR)cstr)` 或 `%ls` 對應 `wchar_t*`
  • 自訂分類:`TRACE0`/`TRACE1`...`TRACE3` 對應 0~3 參數,效能略高
  • 重導向:衍生 `CDebugReportHook` 可將輸出導向檔案、視窗、網路

實戰範例:追蹤遞歸呼叫深度


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);
}

輸出視窗將顯示縮排的呼叫堆疊,直觀呈現遞歸深度。

注意事項

  • `TRACE` 使用 `OutputDebugString`,若無除錯器附著,輸出會丟失 (可用 DebugView 捕捉)
  • 避免在高頻迴圈 (如每幀渲染) 大量 `TRACE`,嚴重影響效能
  • 格式字串務必與參數匹配,否則導致堆疊損壞
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved