1. 程式人生 > 程式設計 >如何用IDEA除錯BUG的幾種方法

如何用IDEA除錯BUG的幾種方法

最近小明的bug有點多,忙的連王者榮耀都顧不上玩了,導致現在不得不抽點時間研究一下作為當前大多Java程式設計師開發工具的IDEA DEBUG功能,以提高效率。

一、條件斷點

場景:我們在遍歷某個集合,期望程式在滿足某些預設條件時停住,比如:沐芳老師在課堂上點名,需要在點到小明的時候暫停確認一下是否有人在幫小明答“到”!

那沐芳老師可以這樣:

如何用IDEA除錯BUG的幾種方法

右擊斷點旁邊的小紅點(斷點),彈出面板,在Condition這裡填入暫停條件,這樣除錯時,當程式滿足條件時就會穩穩地停在student= "小明"的位置。

二、回到"過去"

場景:人非聖賢,孰能無過。在日常開發中,大家都有手殘的時候,比如在除錯一個業務邏輯比較複雜,有多個方法巢狀時,一不小心手抖,斷點過去了,這該怎麼辦?

這天,沐芳老師如往常一樣在上課前點名,當點到小明的時候,不爭氣的小明在偷偷看喜歡的妹子,沒有注意聽,當反應過來時,已經錯過了答到!十分懊悔(紅顏禍水啊),這時小明就可以借用大雄的機器貓進行時光穿梭:

如何用IDEA除錯BUG的幾種方法

觀察上圖,我們看到,按照點名順序,現在沐芳老師點名已經輪到小紅,小明已經錯過答到,機器貓可以這樣幫助小明:點選上圖紅色框框圈中的Drop Frame圖示(如果存在多個方法的巢狀呼叫,可以多點幾下),就這樣,小明穿越了,沒有錯過這次的答到:

如何用IDEA除錯BUG的幾種方法

tips:這個按鈕之所以叫做Drop Frame,是因為JVM內部是以棧幀為單位來儲存執行緒的執行狀態,Drop Frame直譯過來就是扔掉當前執行的棧幀,回到上一幀的位置,這樣就實現了穿越。

三、多執行緒除錯

終於老師點名結束了,現在可以正常上課了。到了同學們最愛的老師提問,同學們搶答的環節。

As we know 當我們啟動多個執行緒時,哪個執行緒內的程式先執行,完全靠CPU的心情(爸爸一樣的存在),這樣就會造成一個問題:無法像單執行緒那樣按照執行順序debug。現象就是你只管打斷點,執行緒之間不亂跳算我輸,程式舉例如下:

如何用IDEA除錯BUG的幾種方法

老師提出問題後,四個同學開始搶答:

如何用IDEA除錯BUG的幾種方法

這麼多同學搶答,讓堅守崗位30多年的沐芳老師覺得再這樣下去課堂可能會有點混亂:但這並難不倒從業30多年的沐芳老師,她按如下圖所示:在斷點的位置上右擊,選擇Thread,就可以有目的地跟蹤某一位同學的搶答情況(一切都在掌握之中)。

如何用IDEA除錯BUG的幾種方法

四、遠端除錯

大家能看到這裡,小明不得不給大家介紹一個裝X的技能:雲除錯。即本機不用啟動專案,只要本機的原始碼與遠端伺服器執行的jar包匹配,就可以在本機直接遠端除錯伺服器上的程式碼!開啟姿勢如下:

遠端專案啟動時,先允許遠端除錯

現在大多都是SpringBoot專案,因此我們在遠端伺服器上執行一個jar包時

java -server -Xms512m -Xmx512m -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8080 -jar xiaoming.jar

這裡起作用的核心命令就是

-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=8080

遠端除錯從技術上講,就是在本機與遠端服務之間建立scoket通訊,所以本機要可以訪問到遠端服務的埠。

在idea中設定遠端除錯

如何用IDEA除錯BUG的幾種方法

接下來我們就可以正常除錯了,除錯方式和本地執行服務除錯無差,不信你發起一個請求,並在對應的邏輯程式碼中打個斷點試試?

五、臨時執行表示式

再一個就是除錯時,我們還可以臨時執行一些表示式,點選紅色框框選中的圖示,然後輸入你想執行的表示式,如下所示:

如何用IDEA除錯BUG的幾種方法

大家可以看到,小明心靈是多麼脆弱,因為無法直面自己的實際年齡,再快要得到真實年齡是,偷偷的減去了7年,所以他實際年齡永遠為18歲(手動滑稽)。

六、修改變數的執行值

當然,如果除錯時,想動態修改變數的值,也很容易,在變數上右擊,然後選擇Set Value,比如簡單粗暴的更改小明的年齡為18……

如何用IDEA除錯BUG的幾種方法

以上,這就是小明近期總結的IDEA的DEBUG技巧,希望可以幫助到大家。善用上述除錯技巧,相信大家擼起程式碼來會更加有感覺,更多相關IDEA除錯BUG內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!