Debug調試常用技巧
斷點(Breakpoint)
斷點:如果把程序想象成一條平滑的線,那麼斷點就是一個結,可以讓程序中斷在需要的地方,從而方便其分析。
設置斷點:在代碼裏需要調試的地方,鼠標雙擊代碼行號的左邊,再次雙擊即可取消斷點。
在調試中可以設置的斷點類型有五種:
行斷點:
spring在註冊Bean定義(registerBeanDefinition)時,如果是org.springframework.demo.MyBean,就掛起線程,可以開始單步調試了。
對於命中次數(hit count)的使用,一般是在循環中,第N個對象的處理有問題,設置hit count = N, 重調試時,可以方便到達需要調試的循環次數時,停下來調試。方法斷點:
方法斷點的好處是可以從方法方法進入或者退出時停下來調試,類似行斷點,而且只有行斷點和方法斷點有條件和訪問次數的設置功能。
但是方法斷點還有另外一個好處,如果代碼編譯時,指定不攜帶調試信息,行斷點是不起作用的,只能打方法斷點。
有興趣的可以將Add line number…前的勾去掉,調試下看看。觀察斷點:
在成員變量上打的斷點。只有對象成員變量有效果,靜態成員變量不起作用。
可以設置變量被訪問或者設置的時候掛起線程/VM。異常斷點:
系統發生異常時,在被捕獲異常的拋出位置處或者程序未捕獲的異常拋出處掛起線程/VM, 也可以指定是否包括異常的子類也被檢測。類加載斷點:
在類名上打的斷點。接口上是打不了類加載斷點的,但是抽象類是可以的,只是在調試的時候,斷點不會明顯進入classloader中,單步進入知會進入到子類的構造方法中,非抽象類在掛起線程後單步進入就會到classloader中(如果沒有filter過濾掉的話)。類加載斷點不管是打在抽象或者非抽象類上,都會在類第一次加載或者第一個子類第一次被加載時,掛起線程/VM。
注意:每種斷點的設置有些許不一樣,可以在斷點上右鍵->Breakpoint properties進行設置,但一般在斷點窗口有快速設置的界面,Breakpoint properties中多了filter, 其實比較雞肋,用處不大。
調試狀態
啓動服務開始調試:
- 方法一:例如上圖的代碼中,鼠標點擊main方法-->右鍵Debug As-->Java Application開始java代碼調試;
- 方法二:直接點擊“調試”按鈕,即點擊小瓢蟲邊上的倒三角,選擇Debug As-->Java Application;
方法三:快捷鍵F11;方法四,菜單欄選擇Run-->Debug,還有其他方法此處不再贅述了。
開發工具首次調試會彈出提示,需要切換到Debug工作區,勾選“Remember my decision”,下次便不再提示。
調試執行:
功能 | 快捷鍵 | 描述 | 備註 |
---|---|---|---|
Step Info | F5 | 單步進入(如果有方法調用,將進入調用方法中進行調試) | 逐語句 |
Step Over | F6 | 單步跳過(不進入行的任何方法調用中,直接執行完當前代碼行,並跳到下一行) | 逐過程 |
Step Return | F7 單步返回(執行完當前方法,並從調用棧中彈出當前方法,返回當前方法被調用處) | 跳出 | |
Resume | F8 | 恢復正常執行(直到遇到下一個斷點) | 繼續運行 |
Run to Line | Ctrl+R | 執行到當前行(將忽略中間所有斷點,執行到當前光標所在行) | |
Drop To Frame | 無 | 回退到指定方法開始處執行,這個功能相當贊。 在方法調用棧上的某個方法右鍵,選擇Drop To Frame就可以從該方法的開始處執行,比如 重新執行本方法,可以在本方法上用Drop To Frame,將從本方法的第一行重新執行。 當然對於有副作用的方法,比如 數據庫操作,更改傳入參數的對象內容等操作可能重新執行就再是你想要的內容了。 |
|
Copy Stack | 無 | 拷貝當前線程棧信息 |