Code Breakpoints#

Code breakpoint 讓你精確控制要檢查哪段程式碼。你指定一個原始碼位置或函式名稱,程式執行到該處時就會暫停,將控制權交給 debugger。

設定方式#

操作EclipseVisual Studiogdb
Toggle BreakpointCtrl-Shift-BShift-F11break file:line
Method BreakpointRun - Toggle Method BreakpointDebug - New Breakpoint - Break at Functionbreak routine-name
RunCtrl-F11F5run
ContinueF8F5continue

進階用法:組合 Breakpoints#

當某個常被呼叫的函式 c 只在特定測試案例 t 中才會出錯時,直接在 c 設 breakpoint 會浪費大量時間。解決方法:

  1. 先在 t 中設定 breakpoint
  2. 程式停在 t 時,再動態啟用 c 的 breakpoint
  3. 這樣只有在 t 的執行路徑中才會攔截 c

攔截異常終止#

現代 debugger 會在程式發生異常時自動中斷:

  • Visual Studio — 提供對話框在 unhandled exception 時中斷
  • gdb — 在程式 abort 時(exception、signal、呼叫 abort())中斷
  • Eclipse — 透過 Run - Add Java Exception Breakpoint 明確指定要攔截的 exception

如果程式有自己的終止邏輯而 debugger 無法自動攔截,可以在 exit_exitabort 函式上設定 breakpoint。

程式掛住(Hang)的處理#

如果程式停止回應,可以用 debugger 強制暫停執行:

  • EclipseRun - Suspend
  • Visual StudioDebug - Break AllCtrl-Alt-Break
  • gdbCtrl-C

暫停後檢查 call stack(見 Item 32)即可了解程式掛在哪裡。

Data Breakpoints(Watchpoints)#

有時你關心的不是程式碼的執行,而是某個資料何時被修改Data breakpoint(又稱 watchpoint)就是為此設計的。

硬體支援#

現代 CPU 內建電路支持 data breakpoint:指定記憶體位址和大小後,CPU 在每次記憶體寫入時自動檢查是否命中,幾乎不影響程式效能

設定方式#

  • Visual StudioDebug - New Breakpoint - New Data Breakpoint(程式必須已啟動,以確定全域變數位址)
  • gdbwatch 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 強制暫停檢查狀態