如何用IDEA調(diào)試BUG的幾種方法
最近小明的bug有點(diǎn)多,忙的連王者榮耀都顧不上玩了,導(dǎo)致現(xiàn)在不得不抽點(diǎn)時(shí)間研究一下作為當(dāng)前大多Java程序員開發(fā)工具的IDEA DEBUG功能,以提高效率。
一、條件斷點(diǎn)場(chǎng)景:我們?cè)诒闅v某個(gè)集合,期望程序在滿足某些預(yù)設(shè)條件時(shí)停住,比如:沐芳老師在課堂上點(diǎn)名,需要在點(diǎn)到小明的時(shí)候暫停確認(rèn)一下是否有人在幫小明答“到”!
那沐芳老師可以這樣:
右擊斷點(diǎn)旁邊的小紅點(diǎn)(斷點(diǎn)),彈出面板,在Condition這里填入暫停條件,這樣調(diào)試時(shí),當(dāng)程序滿足條件時(shí)就會(huì)穩(wěn)穩(wěn)地停在student= '小明'的位置。
二、回到'過去'場(chǎng)景:人非圣賢,孰能無過。在日常開發(fā)中,大家都有手殘的時(shí)候,比如在調(diào)試一個(gè)業(yè)務(wù)邏輯比較復(fù)雜,有多個(gè)方法嵌套時(shí),一不小心手抖,斷點(diǎn)過去了,這該怎么辦?
這天,沐芳老師如往常一樣在上課前點(diǎn)名,當(dāng)點(diǎn)到小明的時(shí)候,不爭(zhēng)氣的小明在偷偷看喜歡的妹子,沒有注意聽,當(dāng)反應(yīng)過來時(shí),已經(jīng)錯(cuò)過了答到!十分懊悔(紅顏禍水啊),這時(shí)小明就可以借用大雄的機(jī)器貓進(jìn)行時(shí)光穿梭:
觀察上圖,我們看到,按照點(diǎn)名順序,現(xiàn)在沐芳老師點(diǎn)名已經(jīng)輪到小紅,小明已經(jīng)錯(cuò)過答到,機(jī)器貓可以這樣幫助小明:點(diǎn)擊上圖紅色框框圈中的Drop Frame圖標(biāo)(如果存在多個(gè)方法的嵌套調(diào)用,可以多點(diǎn)幾下),就這樣,小明穿越了,沒有錯(cuò)過這次的答到:
tips:這個(gè)按鈕之所以叫做Drop Frame,是因?yàn)镴VM內(nèi)部是以棧幀為單位來保存線程的運(yùn)行狀態(tài),Drop Frame直譯過來就是扔掉當(dāng)前運(yùn)行的棧幀,回到上一幀的位置,這樣就實(shí)現(xiàn)了穿越。
三、多線程調(diào)試終于老師點(diǎn)名結(jié)束了,現(xiàn)在可以正常上課了。到了同學(xué)們最愛的老師提問,同學(xué)們搶答的環(huán)節(jié)。
As we know 當(dāng)我們啟動(dòng)多個(gè)線程時(shí),哪個(gè)線程內(nèi)的程序先執(zhí)行,完全靠CPU的心情(爸爸一樣的存在),這樣就會(huì)造成一個(gè)問題:無法像單線程那樣按照?qǐng)?zhí)行順序debug。現(xiàn)象就是你只管打斷點(diǎn),線程之間不亂跳算我輸,程序舉例如下:
老師提出問題后,四個(gè)同學(xué)開始搶答:
這么多同學(xué)搶答,讓堅(jiān)守崗位30多年的沐芳老師覺得再這樣下去課堂可能會(huì)有點(diǎn)混亂:但這并難不倒從業(yè)30多年的沐芳老師,她按如下圖所示:在斷點(diǎn)的位置上右擊,選擇Thread,就可以有目的地跟蹤某一位同學(xué)的搶答情況(一切都在掌握之中)。
大家能看到這里,小明不得不給大家介紹一個(gè)裝X的技能:云調(diào)試。即本機(jī)不用啟動(dòng)項(xiàng)目,只要本機(jī)的源代碼與遠(yuǎn)程服務(wù)器運(yùn)行的jar包匹配,就可以在本機(jī)直接遠(yuǎn)程調(diào)試服務(wù)器上的代碼!打開姿勢(shì)如下:
遠(yuǎn)程項(xiàng)目啟動(dòng)時(shí),先允許遠(yuǎn)程調(diào)試
現(xiàn)在大多都是SpringBoot項(xiàng)目,因此我們?cè)谶h(yuǎn)程服務(wù)器上運(yùn)行一個(gè)jar包時(shí)
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,server=y,suspend=n,address=8080
遠(yuǎn)程調(diào)試從技術(shù)上講,就是在本機(jī)與遠(yuǎn)程服務(wù)之間建立scoket通訊,所以本機(jī)要可以訪問到遠(yuǎn)程服務(wù)的端口。
在idea中設(shè)置遠(yuǎn)程調(diào)試
接下來我們就可以正常調(diào)試了,調(diào)試方式和本地運(yùn)行服務(wù)調(diào)試無差,不信你發(fā)起一個(gè)請(qǐng)求,并在對(duì)應(yīng)的邏輯代碼中打個(gè)斷點(diǎn)試試?
五、臨時(shí)執(zhí)行表達(dá)式再一個(gè)就是調(diào)試時(shí),我們還可以臨時(shí)執(zhí)行一些表達(dá)式,點(diǎn)擊紅色框框選中的圖標(biāo),然后輸入你想執(zhí)行的表達(dá)式,如下所示:
大家可以看到,小明心靈是多么脆弱,因?yàn)闊o法直面自己的實(shí)際年齡,再快要得到真實(shí)年齡是,偷偷的減去了7年,所以他實(shí)際年齡永遠(yuǎn)為18歲(手動(dòng)滑稽)。
六、修改變量的運(yùn)行值當(dāng)然,如果調(diào)試時(shí),想動(dòng)態(tài)修改變量的值,也很容易,在變量上右擊,然后選擇Set Value,比如簡(jiǎn)單粗暴的更改小明的年齡為18……
以上,這就是小明近期總結(jié)的IDEA的DEBUG技巧,希望可以幫助到大家。善用上述調(diào)試技巧,相信大家擼起代碼來會(huì)更加有感覺,更多相關(guān)IDEA調(diào)試BUG內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!
相關(guān)文章:
1. html小技巧之td,div標(biāo)簽里內(nèi)容不換行2. CSS hack用法案例詳解3. 告別AJAX實(shí)現(xiàn)無刷新提交表單4. javascript xml xsl取值及數(shù)據(jù)修改第1/2頁5. HTML DOM setInterval和clearInterval方法案例詳解6. CSS Hack大全-教你如何區(qū)分出IE6-IE10、FireFox、Chrome、Opera7. 詳解盒子端CSS動(dòng)畫性能提升8. 讀大數(shù)據(jù)量的XML文件的讀取問題9. XML入門的常見問題(一)10. 使用css實(shí)現(xiàn)全兼容tooltip提示框
