當運行結果跟我們設想的不一致時,我們就可以用debug進行代碼調試,下面是我在日常開發中對debug的一些小結
(一)基本介紹
本篇文章是基於IntelliJ IDEA2018.3.2版本,Debug模式的圖標因為不同版本有點點小區別,但是功能基本一樣。
如圖紅色框框甲殼蟲模樣的便是我們本文中的debug啟動模式,在日常開發中也是用這個啟動開發項目,文章候面會詳細對比各種啟動方式的異同
打斷點方法和Eclipse類似,只需要在自己想要調試的代碼左邊行號欄單擊左鍵就可以,或者快捷鍵Ctrl+F8 打上/取消斷點,下面先談談如何進行debug的優化設置,如圖
如上圖標識所示,設置 Debug 連接方式,默認是 Socket 。 Shared memory 是 Windows 特有的一 個屬
性,一般在 Windows 系統下建議使用此設置,內存占用相對較少。
2 進入Debug運行模式
設置斷點:在代碼的左邊欄單擊,出現 ,則說明已經此行代碼設置了斷點,可對任意多行設置
取消斷點:單擊 就取消了斷點
進入Debug模式:代碼空白處右鍵,然后選擇 Debug HelloWorld.main() ‘;或快捷鍵 Ctrl+F5
Debug啟動后,程序會停頓在第一個斷點上,debug視圖主要界面如下,各個按鍵分別是什么意思呢?
1. Show Execution Point (Alt + F10):如果你的光標在其它行或其它頁面,點擊這個按鈕可跳轉到當前代碼執行的行。
2. Step Over (F8):越過,一行一行地往下走,如果這一行上有方法不會進入方法。
3. Step Into (F7):步入,如果當前行有方法,可以進入方法內部,一般用於進入自定義方法內,不會進入官方類庫的方法。
4. Force Step Into (Alt + Shift + F7):強制步入,能進入任何方法,查看底層源碼的時候可以用這個進入官方類庫的方法。
5. Step Out (Shift + F8):步出,從步入的方法內退出到方法調用處,此時方法已執行完畢,只是還沒有完成賦值。
6. Drop Frame (默認無):回退斷點,后面章節詳細說明。
7. Run to Cursor (Alt + F9):運行到光標處,你可以將光標定位到你需要查看的那一行,然后使用這個功能,代碼會運行至光標行,而不需要打斷點。
7右邊的小計算器. Evaluate Expression (Alt + F8):計算表達式。
8. 重啟項目,快捷鍵Ctrl + F5,一般在你的代碼有改動后可執行這個功能,意味重新啟動項目。
9. 恢復程序,快捷鍵F9,在有多個斷點的情況下,會直接跳到下一個斷點,如果當前斷點為最后一個則直接運行結束。
10. 暫停項目
11. 停止當前啟動的項目。快捷鍵Ctrl + F2
12. View Breakpoints 查看所有斷點。快捷鍵Ctrl + Shift + F8
13..靜啞斷點,使所有斷點無效,類似於無斷點運行。選擇這個后,所有斷點變為灰色,斷點失效,按F9則可以直接運行完程序。再次點擊,斷點變為紅色,有效。例如:加入斷點過多,我們在其中某一個斷點已經找到問題想要的答案,后面的斷點不想繼續了,可以點擊一下該功能,就可以直接運行到程序結束。
(二)快捷鍵一覽表
Run Shift + F10 運行最近一次運行的函數 Debug Shift + F9 運行debug最近一次運行的函數 Run Alt + Shift + F10 初次運行指定的函數 Debug Alt + Shift + F9 初次debug運行指定的函數 Stop Ctrl + F2 停止項目 Step Over F8 越過當前函數 Forcce Step Over Alt + Shift + F8 強制越過 Step Into F7 步入當前函數 Force Step Into Alt + Shift + F7 強行進入當前函數 Smart Step Into Shift + F7 只能進入當前函數 Step out Shift + F8 步出 Resume Program F9 恢復程序 Evaluate Expression Alt + F8 計算表達式
(三)查看變量
在Debug過程中,跟蹤查看變量的變化是非常必要的,這里就簡單說下IDEA中可以查看變量的幾個地方
1.在IDEA中,參數所在行后面會顯示當前變量的值。
2.光標懸停到參數上,顯示當前變量信息,非常的方便。
3.在Variables控制台里查看,這里顯示當前方法里的所有變量。
4.在Watches里,點擊New Watch,輸入需要查看的變量。或者可以從Variables里拖到Watches里查看。
(四)計算表達式
計算表達式,Evaluate Expression (Alt + F8) 。可以使用這個操作在調試過程中計算某個表達式的值,而不用再去打印信息。
1.點擊計算表達式按鈕或快捷鍵Alt + F8,你也可以選中某個表達式再Alt + F8,彈出計算表達式的窗口,如下,回車或點擊Evaluate計算表達式的值
這個表達式不僅可以是一般變量或參數,也可以是方法,當你的一行代碼中調用了幾個方法時,就可以通過這種方式查看查看某個方法的返回值。
(五)調試技巧
鼠標右鍵點擊斷點,調出如下窗口,當然也可以通過快捷鍵Ctrl + Shift + F8
1、斷點條件設置
如上圖通過設置Conditionn內容設置斷點條件,通過設置斷點條件,在滿足條件時,才停在斷點處,否則直接運行。
如遍歷集合或者數組的時候,我們只想當下標等於某個值的時候才進入斷點調試。如我希望當 a=a時才進入斷點,
2、多線程調試
一般debug都是單線程調試,但是開發過多線程應用,有些時候,為了觀察多個線程間變量的不同狀態,以及鎖的獲取等,就會想到在代碼里加個斷點debug一下。在IDE里斷點停下來的時候,可以切換到另外的線程中,跑其他的代碼,不會互相影響。但是在IntelliJ IDEA里默認是沒有開啟的。也就是說如果你在IDEA里代碼里加斷點,雖然一個線程的斷了下來,但其他線程的已經執行過了。此處勾選上Suspend,並選擇Thread,設置make default之后,也可以開始多線程應用的調試。
一個線程斷下來之后,可以通過在線程窗口切換,到其它線程中繼續運行。IntelliJ IDEA里在這兒切換
3、回退斷點
在調試的時候如果點擊過快,錯過了自己想要關注的那一行,如何能跳回到上一步呢?依靠后退執行的功能,可以后退,就像下棋時悔棋那種功能一樣。
所謂的斷點回退,其實就是回退到上一個方法調用的開始處,在IDEA里測試無法一行一行地回退或回到到上一個斷點處,而是回到上一個方法。回退的方式有兩種:
第一種是Drop Frame按鈕,按調用的方法逐步回退,包括三方類庫的其它方法(取消Show All Frames按鈕會顯示三方類庫的方法)。
第二種方式,在調用棧方法上選擇要回退的方法,右鍵選擇Drop Frame,回退到該方法的上一個方法調用處,此時再按F9(Resume Program),可以看到程序進入到該方法的斷點處了。
但有一點需要注意,斷點回退只能重新走一下流程,之前的某些參數/數據的狀態已經改變了的是無法回退到之前的狀態的,如對象、集合、更新了數據庫數據等等。