挖掘IntelliJ IDEA的調試功能
本文介紹了IntelliJ IDEA的一些相對不那麼廣為人知,但是又很實用的調試功能。希望能讓你的IDE發揮出最大的功效!本文使用的IDEA版本是社區版,快捷鍵是。本文的兄弟篇是挖掘IntelliJ IDEA的實用功能。
斷點
斷點類型
一般來說調試時,我們都是在代碼行上滑鼠一點,然後運行測試,遇斷點所在的行即停,這就是所謂的行斷點。IDEA支持以下幾種斷點類型:
行斷點(Line Breakpoints):就是我們最經常用的方式。
方法斷點(Method Breakpoints):如果你看到代碼調用了一個介面,但不知道具體會跑在哪個實現上,便可以在介面上設置斷點,這樣不管哪個子類運行到這個方法都會停下來。
異常斷點(Exception Breakpoints):可以在Run->View Breakpoints中的Java Exception Breakpoints里添加異常的具體類型。這樣的話,程序中一旦發生了這種異常馬上就會停下來。
欄位斷點(Field Watchpoints):可以設置在欄位上,這樣讀寫欄位都可以觸發。需要注意的是,默認只有寫才會停下,想要讓讀取時也停下,需要右擊斷點,在Watch的Field access上打勾才行。
條件斷點
斷點是可以設置條件的,這樣便可以只在關心的時候停下來。比如說循環里處理一堆字元串,但是只關心特定的字元串,那條件斷點便可以派上用場。按住Shift鍵設置斷點,或是右擊斷點之後選擇More來打開以下界面
上圖就是設置條件斷點的界面,直接在Condition里輸入條件即可,如。需要注意的是,Suspend默認是沒有打勾的,必須勾選上才能讓程序暫停。另外,辛辛苦苦設置的特定斷點,是可以拖拽到別的地方去的,這樣就省的到處敲來敲去的了。還有一個小技巧是按住Alt的同時設置斷點,可以讓斷點僅停一次便自動消失。在設置臨時斷點時有點用。
無斷點暫停
如果在很長的循環時不知道程序運行到哪裡了,可以在調試時點擊調試窗口上的Pause Program,這樣程序便能在當前執行的地方暫停。另外,運行到游標(Run to cursor)也可以在沒有設置斷點的時候讓程序運行到游標所在行時暫停。
調試技巧
下面介紹一些調試的小技巧。
智能進入(Smart step into)
當調試程序運行到類似這樣的句子時,如果你想看的是方法,那麼進入這個方法就相對麻煩一些。
這時可以使用調試窗口上的智能進入,程序會彈出一個對話框,我們選擇需要的調用處即可。算是一個提升調試效率的小技巧。
官方文檔傳送門:https://www.jetbrains.com/help/idea/debugging-code.html#d181035e286
表達式評估(Evaluate expression)
這應該是大部分人都知道的技巧了,可以通過表達式評估來重新賦值當前的變數,以便讓程序運行到其它的分支去。當然也可以在Variables窗口中,右擊想要改變的變數,選擇Set Value。不過表達式評估里可以輕鬆增加新變數、動態import新類庫等,功能更加強大。
官方文檔傳送門:https://www.jetbrains.com/help/idea/evaluating-expressions.html
遠程調試(Remote debug)
如果運行的實例在其它機器(或者虛擬機、docker)上,只要實例設置了以下參數,就可以通過遠程調試連接到埠進行調試。
官方文檔傳送門:https://www.jetbrains.com/help/idea/debugging-code.html#d181035e408
對於IDEA來說,只需要在Run->Edit Configuration里,增加一個Remote,設置主機Host和埠Port,然後調試它即可。
棄棧幀(Drop frame)
Visual Studio好的一點是調試時可以拖拽當前執行的位置,方便反覆查看。雖然IDEA沒有這樣的功能,但是它可以使用棄棧幀來把當前調用棧的第一棧幀丟棄掉,相當於重新開始當前調試的方法。使用方法也算簡單,在要丟棄的棧幀上右擊,選擇Drop Frame即可。或者直接單擊調試窗口的Drop Frame按鈕。不過需要注意的是,如果對象在子方法運行時發生了變化,是不會再變回去的。
官方文檔傳送門:https://www.jetbrains.com/help/idea/debugging-code.html#d181035e308
強制拋異常(Throw an exception):
官方文檔傳送門:https://www.jetbrains.com/help/idea/altering-the-program-s-execution-flow.html#throw_exception
強制返回(Force return):
官方文檔傳送門:https://www.jetbrains.com/help/idea/altering-the-program-s-execution-flow.html
自動載入變化代碼(Reload changes)
利用Java虛擬機提供的HotSwap功能,我們可以做到一邊調試一邊改代碼。只要在修改完代碼之後,點擊Run->Reload Changed Classes即可。不過HotSwap有一些限制,例如不支持static的欄位和方法等。
官方文檔傳送門:https://www.jetbrains.com/help/idea/altering-the-program-s-execution-flow.html#reload_classes
顯示方法返回值(Show method return values)
調試窗口裡的Settings->Show Method Return Values開關可以顯示方法的返回值。例如以下方法:
只要在上設斷點然後Step Over,或者在方法內部的任何地方設斷點然後Step Out一下,便可以在調用處的變數窗口看到一個類似於這樣的值:。在這個方法調用沒有賦值給變數時(如)還挺有用的。
調試流(Trace Current Stream Chain)
前面說了Visual Studio的好,但是它調試時不能看lambda的值也真是挺噁心的,據說2015版以後開始支持有限的lambda了。IDEA在這方面就做的非常到位。Java 8帶來的Stream裡面到底是什麼,有時候很難知道。通過IDEA提供的這個功能,我們可以很輕鬆地看到流在各個步驟之間的變化。如下圖
展平模式(Flat Mode)更是提供了全局的視角
使用這個功能也非常簡單,當程序在lambda表達式的任意處停下時,單擊調試窗口的Trace Current Stream Chain按鈕即可。
官方文檔傳送門:https://www.jetbrains.com/help/idea/analyze-java-stream-operations.html
調試內存泄漏(Memory View)
內存泄漏是一個比較頭疼的問題,好在IDEA提供了內存分析工具,只要單擊調試窗口右上角的Restore 『Memory』 View就能看到內存窗口,然後點擊其中的Click to load the classes list就能看到當前內存的對象分布情況。然後可以據此分析到底是哪個類的對象數量看起來有問題。
官方文檔傳送門:https://www.jetbrains.com/help/idea/analyze-objects-in-the-jvm-heap.html
調試lombok
如果只是想暫停一下set或get方法,可以使用欄位斷點,只不過可能會在調試中報錯:Source code does not match the bytecode,但它能夠工作。
如果想設斷點的是、等方法,可以在調試時使用:Refactor->Delombok並選擇相對應的註解,然後再使用上文介紹的HotSwap功能,就可以生成代碼並按需調試了。最後別忘記把代碼恢復回來。
其它
調試非同步、線程、死鎖、活鎖等高級功能,官網上面有詳細的教程,可以在用到時參考。
官方文檔傳送門:https://www.jetbrains.com/help/idea/tutorial-java-debugging-deep-dive.html
快捷鍵
功能熟悉了以後,熟練使用快捷鍵能夠大幅提高效率。以下是筆者調試時經常使用的快捷鍵:
F7:進入調用的方法
F8:單步運行
F9:繼續運行
Shift+F7:智能進入調用的方法
Shift+F8:跳出當前方法
Alt+F8:表達式評估
Alt+F9:運行到游標
Ctrl+Shift+F9:調試當前游標所在方法或類
Ctrl+Shift+F10:運行當前游標所在方法或類
Shift+F9:調試上次運行的測試
Shift+F10:運行上次運行的測試
Command+Shift+T:切換測試和實現
TAG:懶程序員筆記 |