Visual C++ 偵錯器提供強大的高級斷點功能,支援上下文限定、條件判斷、變數變更偵測、記憶體位址監控、Windows 訊息攔截等,能精準定位最棘手的 Bug。本文系統整理語法與實戰技巧。
斷點位置 = 上下文 + 位置/運算式/變數/訊息條件
{[函數], [原始檔], [二進位模組]} 位置或條件
{, TEST.CPP,}.20 (TEST.CPP 第 20 行);{, TEST.CPP, B.DLL}.20 (僅在 B.DLL 呼叫時中斷)。CString::operator=(const char*)。前提:載入 DLL 符號表 (PDB/COFF)。Win2K 以上支援系統 DLL 斷點。
Loading symbols for XXX.dll 表示符號已載入。{,,Kernel32.dll}LoadLibraryA
__stdcall (WINAPI/CALLBACK):**前綴 `_`,後綴 `@參數位元組數`** → _LoadLibraryA@4__cdecl (C/C++ 預設):**前綴 `_`** → _MyFunc__fastcall:**前綴 `@`,後綴 `@參數位元組數`** → @MyFunc@8{,,Kernel32.dll}_LoadLibraryA@4@TIB (Thread Information Block 位址) 限定特定執行緒中斷,如 @TIB==0xE000;@ERR 最後錯誤碼,如 @ERR==2 (FILE_NOT_FOUND)。*p),第二欄輸入監控元素個數。*(char*)0x5000 == 'G';避免 WO(0x5000) 等複雜運算式導致無法用硬體暫存器。*(long*)0x5000 監控 4 位元組變化。AfxWndProc) 與訊息範圍 (如 WM_MOUSEFIRST~WM_MOUSELAST)。AfxWndProc 共用,會頻繁中斷,建議搭配條件運算式限定 HWND 或訊息碼。| 慣例 | 關鍵字 | 參數壓棧順序 | 堆疊清理 | 名稱修飾 | 適用場景 |
|---|---|---|---|---|---|
| __stdcall | WINAPI, CALLBACK, PASCAL | 右至左 | 被呼叫者 | _Func@N | Win32 API, 回呼函數 |
| __cdecl | 預設 (C/C++) | 右至左 | 呼叫者 | _Func | 一般函數, 可變參數 |
| __fastcall | __fastcall | 前兩參數用 ECX/EDX, 其餘右至左 | 被呼叫者 | @Func@N | 高效能需求 |
| thiscall | 隱含 (C++ 成員函數) | this 在 ECX, 參數右至左 | 被呼叫者 | 類別內部 | 非靜態成員函數 |
| naked call | __declspec(naked) | 自定 | 自定 | 無修飾 | 手寫組語/特殊進出棧 |
熟練掌握高級斷點,能讓偵錯效率提升數倍。關鍵在於:善用上下文精準定位、條件運算式過濾雜訊、命中計數跳過已知安全迴圈、資料斷點捕捉記憶體竄改、訊息斷點追蹤 GUI 異常。建議在專案中建立「偵錯技巧筆記」,遇到棘手 Bug 時快速查閱套用。