Code Breakpoints#
Code breakpoint 讓你精確控制要檢查哪段程式碼。你指定一個原始碼位置或函式名稱,程式執行到該處時就會暫停,將控制權交給 debugger。
設定方式#
| 操作 | Eclipse | Visual Studio | gdb |
|---|---|---|---|
| Toggle Breakpoint | Ctrl-Shift-B | Shift-F11 | break file:line |
| Method Breakpoint | Run - Toggle Method Breakpoint | Debug - New Breakpoint - Break at Function | break routine-name |
| Run | Ctrl-F11 | F5 | run |
| Continue | F8 | F5 | continue |
進階用法:組合 Breakpoints#
當某個常被呼叫的函式 c 只在特定測試案例 t 中才會出錯時,直接在 c 設 breakpoint 會浪費大量時間。解決方法:
- 先在
t中設定 breakpoint - 程式停在
t時,再動態啟用c的 breakpoint - 這樣只有在
t的執行路徑中才會攔截c
攔截異常終止#
現代 debugger 會在程式發生異常時自動中斷:
- Visual Studio — 提供對話框在 unhandled exception 時中斷
- gdb — 在程式 abort 時(exception、signal、呼叫
abort())中斷 - Eclipse — 透過 Run - Add Java Exception Breakpoint 明確指定要攔截的 exception
如果程式有自己的終止邏輯而 debugger 無法自動攔截,可以在
exit、_exit或abort函式上設定 breakpoint。
程式掛住(Hang)的處理#
如果程式停止回應,可以用 debugger 強制暫停執行:
- Eclipse — Run - Suspend
- Visual Studio — Debug - Break All 或
Ctrl-Alt-Break - gdb —
Ctrl-C
暫停後檢查 call stack(見 Item 32)即可了解程式掛在哪裡。
Data Breakpoints(Watchpoints)#
有時你關心的不是程式碼的執行,而是某個資料何時被修改。Data breakpoint(又稱 watchpoint)就是為此設計的。
硬體支援#
現代 CPU 內建電路支持 data breakpoint:指定記憶體位址和大小後,CPU 在每次記憶體寫入時自動檢查是否命中,幾乎不影響程式效能。
設定方式#
- Visual Studio — Debug - New Breakpoint - New Data Breakpoint(程式必須已啟動,以確定全域變數位址)
- gdb —
watch variable_name(若回應Hardware watchpoint表示使用硬體支援) - Eclipse (Java) — 對欄位右鍵選 Toggle Breakpoint
對於 heap 上動態配置的變數或函式的 local 變數,必須先設一個 code breakpoint 等到變數存在後,再用其位址設定 data breakpoint。
條件式 Breakpoints#
Debugger 還支援更精細的 breakpoint 控制:
- Conditions — 只在特定條件為 true 時才中斷
- Hit counts — 在命中指定次數後才中斷
- Thread filters — 只在特定 thread 中生效
過度依賴這些進階功能有時是個訊號,表示你可能需要更強大的除錯手段,例如精確的測試案例或強大的 logging。
重點回顧#
- 用 code breakpoint 精準鎖定你關心的程式碼
- 透過組合 breakpoints 跳過不相關的執行路徑
- 利用 exception breakpoint 或在
exit設 breakpoint 來攔截異常終止 - 用 data breakpoint 追蹤變數被神秘修改的問題
- 遇到程式 hang 時,用 debugger 強制暫停檢查狀態