1 多線程調試程序員
開發過多線程應用的朋友應該有體會,有些時候,爲了觀察多個線程間變量的不一樣狀態,以及鎖的獲取等,就會想到在代碼里加個斷點debug一下。安全
在IDE裏斷點停下來的時候,能夠切換到另外的線程中,跑其餘的代碼,不會互相影響。固然,這裏是有個開關的,在Eclipse裏默認開啓,多線程
可是在IntelliJ IDEA裏默認是沒有開啓的。也就是說若是你在IDEA裏代碼里加斷點,雖然一個線程的斷了下來,但其餘線程的已經執行過了。此處把線程的suspend設置成和Eclipse模式同樣以後,也能夠開始多線程應用的調試。簡單設置能夠直接在斷點處,將suspend改爲Thread
lua
一個線程斷下來以後,能夠經過在線程窗口切換,到其它線程中繼續運行。線程
IntelliJ IDEA裏在這兒切換debug
咱們看到main線程和pool-1-thread-1這兩個線程都處於RUNNING狀態,切換到任何一個均可以繼續運行。3d
此時,就能夠寫一個多線程的應用,同時向ArryList這一類非線程安全的容器中存放內容,而後觀察爲何他們是線程不安全的,會出現什麼問題,生動又形象。調試
PS: 這裏順道說一下,這就是爲何建立線程時建議起一個有意義的名字,至少是能夠識別的名字,不然在這裏都不能區分出哪一個是本身的線程,想切換還麻煩。對象
2 後退執行blog
這裏所說的後退執行,是有些時候咱們在debug代碼時,懶的每一個方法都進入單步調試,就會出現你觀察一個變量值的變化時,某個方法沒跟進去,結果值就變了,不得不重來一次。
依靠後退執行的功能,能夠後退,就像下棋時悔棋那種功能同樣。固然,這個後退招待的名字是我本身起的,在IDE裏被稱爲Drop Frame。
有了這個功能,咱們在Drop 了當前這個Frame以後,已經改變的變量值不會恢復。好比你向當前調用方法裏傳入了一個List,而且在方法中向List裏添加了內容,那在Drop到調用該方法的地方時,List不會恢復到以前的狀態。
可是在該方法再次被調用時,你能夠觀察List何時被改變的,至少不須要再重跑一遍程序了。甚至你能夠一言不合就後退。
3 條件斷點
爲了調試代碼,就須要在要觀察變動的地方添加斷點,而後當心翼翼的一步步執行。可是若是是在一個循環裏,又或者該方法會被多線程同時調用到的時候,你當心的向下單步調試,發現沒有你關心的內容,又從循環開始處跑下來,仍是沒你的內容,人就開始煩燥起來。
其實,在添加斷點的時候,咱們能夠爲斷點增長必定的條件,這樣,在指定的條件知足時,斷點纔會生效。
IntelliJ IDEA內,在斷點上右擊,會彈出以下圖的條件框,輸入指定的條件便可。
有了條件斷點,不相關,不感興趣的代碼就能夠直接跳過了。
4 片段代碼
這個沒想好用什麼名字來表述。有些時候在調試過程當中,突然想招待一段與此相關,但不在源文件中的代碼來觀察一下,輔助進行問題分析。此時你會中止程序,添加代碼而後從新跑一次嗎?
在IDEA裏有一個執行代碼片段的功能,能夠在當前代碼的上下文內,執行你臨時寫的代碼。
例如,當前方法傳入一個List,但這個方法裏少一個你後面條件須要使用到的元素,此時你能夠臨時使用片段代碼執行的功能,添加一個進去。
注意,在IntelliJ IDEA裏,這個上面紅框,像個小計算器的按鈕就是臨時執行的功能,點擊以後,會彈出按鈕下方這個Evaluate Expression的框,輸入代碼,點擊右下角的Evalute便可。返回值會顯示在Result處。
這就就至關於臨時改變了變量內容。
而後,還能夠調用對象的方法,執行功能,獲取屬性值等。
5 查看變量修改值
每一個IDE在調試代碼時都提供了一個觀察當前上下文變量值的窗口。其實除了查看以外,一些非final的基本類型,還能夠直接在此處修改值。這樣若是屢次循環執行時,每次能夠恢復到指望的值,不須要重啓程序。