Single-Stepping 的價值#
現代電腦每秒處理數十億條指令,要即時追蹤程式的詳細執行是不可能的。Debugger 的 single-step 功能讓你能一次執行一條程式語句(或機器指令),精準地找出程式執行序列中的錯誤,例如條件判斷走錯分支、迴圈執行次數不對等。
啟動 Single-Stepping#
不同工具的啟動方式:
- Eclipse — 開啟 debug perspective(Window - Open Perspective - Debug),然後 Run - Debug 或
F6啟動,按F5逐步執行 - Visual Studio — Debug - Step Into 或直接按
F11 - gdb — 以
gdb path/to/myprog啟動,設定 breakpoint(如break main),然後執行step指令
許多物件導向語言會在程式的
main入口點之前就執行 static object 的建構子。
三種步進模式#
| 模式 | Eclipse | Visual Studio | gdb | 用途 |
|---|---|---|---|---|
| Step Into | F5 | F11 | step | 進入函式內部,查看詳細執行 |
| Step Over | F6 | F10 | next | 跳過函式,只看回傳結果 |
| Step Return | F7 | Shift-F11 | finish | 執行完目前函式,返回呼叫者 |
典型的除錯流程#
- Step over 大部分不相關的程式碼
- Step into 你懷疑有問題的函式
- 如果不小心進入了不需要看的函式,用 step return 快速跳出
發現錯過了問題怎麼辦#
有時你在 step over 之後才發現應該要 step into 某個函式。解決方法:
- 在呼叫該函式的語句上設定一個 breakpoint
- 重新執行或從 UI 重新啟動問題流程
- 程式會停在你要 step into 的位置
也可以考慮使用 debugger 的 reverse debugging 功能(見 Item 31),省去重跑程式的時間。
重點回顧#
- 透過 stepping through 程式碼來檢查執行序列與程式狀態
- 用 step over 跳過不相關的部分,加速除錯過程
- 用 設定 breakpoint + 重跑 + step into 的方式,針對遺漏的問題函式進行深入除錯