偵錯能力是資深工程師的核心素養。VC6 偵錯器雖屬用戶模式,但功能強大、介面友善,掌握其進階技巧可大幅縮短問題定位時間。本文深入講解條件斷點、資料斷點、呼叫堆疊斷點、指令指標跳轉等實戰技法。
專家建議:70% 時間用 VC++,其餘用 WinDBG/SoftICE。本文聚焦 VC6 偵錯器。
for (int i=0; i<1000; i++) {
int k = i*10 - 2;
SendTo(k);
int tmp = DoSome(i); // 偶爾傳回 0 導致後續除零錯誤
int j = i / tmp;
}
若在錯誤行設斷點,需手動 F5 數百次。解決方案:
DoSome 呼叫行)。487 times remaining,表示第 513 次迴圈出錯。513,再次執行直接停在第 513 次迴圈,即可單步進入 DoSome 追蹤。在 Condition 對話框「Expression」輸入:
i == 100:僅當 i=100 時中斷。tmp == 0:變數達特定值中斷。tmp):該變數值改變時中斷,極適合追蹤「誰修改了這個變數」。char szName1[10], szName2[4];
strcpy(szName1, "shenzhen");
strcpy(szName2, "vckbase"); // 寫入 7 字節,溢位覆蓋 szName1
輸出顯示 szName1 變為 "ase",但程式碼無直接修改 szName1。
printf 處設一般斷點,F5 執行至該處。&szName1,Size 設 10(或僅監視首字節)。strcpy(szName2...) 行,直接定位罪魁禍首。資料斷點亦支援條件,如 szName2[0] == 'y',僅當特定記憶體值滿足條件時觸發。
Alt+7 開啟 Call Stack,右鍵任意幀 → Insert Breakpoint。適用於從深層呼叫快速返回特定函數。
偵錯中右鍵目標行 → Set Next Statement,EIP 直接跳轉。同一函數內可任意前後跳躍,適用於:
0x65,u → 顯示 101(無號十進位)。@err 或 @err,hr(含錯誤說明)。MyFunc(param)。警告:單步執行時每步皆會呼叫,用畢立即刪除。功能有限,前述技巧均可替代,不建議依賴。
偵錯核心在於「假設─驗證」循環。熟練運用條件斷點(命中次數/運算式)、資料斷點(記憶體監視)、呼叫堆疊斷點、指令跳轉與 Watch 視窗進階功能,能將驗證效率提升數倍。工具再好,思考永遠是第一位的。