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

Visual C++ 除錯實戰技巧與常見錯誤避坑指南

     編輯:關於VC++

利於除錯的程式碼風格

  • 避免全域變數,降低耦合與副作用。
  • 所有變數初始化(成員變數於建構函式中)。
  • 善用 const 防止誤改。
  • 撰寫詳盡註解,助事後追蹤。

編譯選項建議

  • 永啟用 /W4 最高警告等級。
  • Debug 版加啟 /GZ,提前發現 Release 才會出現的問題(未初始化變數、堆疊破壞等)。
  • 零警告編譯:消除前務必審查,避免掩蓋真實缺陷。

核心除錯方法

1. 斷言 Assert(原則:極簡)

僅 Debug 生效,Release 自動移除。範例:

char* strcpy(char* dest, char* source) {
    assert(source != 0);
    assert(dest != 0);
    char* ret = dest;
    while ((*dest++ = *source++) != '\0') ;
    return ret;
}

2. 防禦性程式設計

以 if 明確檢查並優雅退出,而非單純斷言:

char* strcpy(char* dest, char* source) {
    if (!source) { assert(false); return 0; }
    if (!dest)   { assert(false); return 0; }
    /* ... 正常邏輯 ... */
}

3. 追蹤輸出 Trace

  • TRACE:MFC 專用,僅 Debug 輸出至 Output 視窗。
    CString cs="test"; TRACE("CString is %s\n", cs);
  • ATLTRACE:ATL 專用。
  • afxDump:配合 #ifdef _DEBUG 輸出複雜物件(如 CTime)。

4. GetLastError 精準定位 API 失敗原因

5. 錯誤資訊落地記錄至檔案,便於事後分析

例外處理原則

錯誤發生時勿直接報錯退出,應嘗試:

  1. 恢復至錯誤前狀態。
  2. 重新啟動任務流程。
  3. 對特定錯誤實施容錯,讓程式繼續完成任務。

實用除錯技巧

  1. F5 啟動除錯:Output 視窗看 TRACE,Call Stack 視窗追蹤呼叫鏈。
  2. 崩潰時選 Retry:進入除錯器,透過 Call Stack 定位錯誤行與原因。
  3. 對映檔除錯:
    • 專案設定 → Link → Generate Mapfile,勾選 /MAPINFO:LINES、/MAPINFO:EXPORTS。
    • 發布時備份所有模組 .map 檔。
    • 對照崩潰位址反查原始碼行號。
  4. 可除錯的 Release 版:C++ → Debug Info 選 Program Database,Link → Debug Info 勾選 Microsoft format。
  5. Watch 視窗查 API 錯誤碼:輸入 @err 或 @err,hr(含文字說明)。
  6. Set Next Statement:直接跳轉至指定行執行,測試例外處理路徑。
  7. 資料中斷點:記憶體變更時中斷,追蹤變數竄改來源。

常見錯誤與對策

現象可能原因對策
函式返回時崩潰自動變數越界 / 函式原型不匹配檢查陣列邊界、核對宣告與定義
MFC 使用者訊息處理失效函式原型錯誤正確原型:afx_msg LRESULT OnMyMessage(WPARAM, LPARAM);
資源洩漏濫用 TerminateThread極度避免,改用旗標通知執行緒自行結束
執行緒建立異常使用 CreateThread改用 _beginthreadex,正確初始化 CRT

結語

良好的編碼習慣、嚴格的編譯選項、系統化的除錯流程,是提升 VC++ 開發效率與軟體品質的三大支柱。

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