IDEA如何調(diào)試debug

這篇文章主要講解了“IDEA如何調(diào)試debug”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“IDEA如何調(diào)試debug”吧!  

創(chuàng)新互聯(lián)長期為1000多家客戶提供的網(wǎng)站建設(shè)服務(wù),團隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為白朗企業(yè)提供專業(yè)的網(wǎng)站設(shè)計制作、網(wǎng)站建設(shè),白朗網(wǎng)站改版等技術(shù)服務(wù)。擁有十多年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。

版本約定

  • IntelliJ IDEA:2020.3.2

小插曲:IDEA剛發(fā)布了其2020.3.2這個小版本,啟動圖換成了20周年圖,IntelliJ IDEA 20周歲啦,為期2天的周年慶活動對開發(fā)者免費開放,感受一下:

IDEA如何調(diào)試debug  
 

正文

Debug調(diào)試對IT從業(yè)者不是個陌生概念,工作中經(jīng)常會用到它,這無關(guān)乎于初級、中級、高級程序員。調(diào)試程序的方式有多種,如:輸出日志、增加輔助變量、拆分函數(shù)體、斷點調(diào)試等等,本文將介紹的是斷點調(diào)試-- 一種最行之有效的調(diào)試方法。準確的講,本文講述是使用IntelliJ IDEA斷點調(diào)試。

Debug用來追蹤代碼的運行流程,通常在程序運行過程中出現(xiàn)異常時,啟用Debug模式可以分析定位異常發(fā)生的位置,以及在運行過程中參數(shù)的變化。除此之外,我們也可以使用Debug模式來跟蹤代碼的運行流程來學(xué)習(xí)優(yōu)秀的開源框架。 

斷點調(diào)試有多重要?

俗話說編碼5分鐘,debug2小時,從這句話就能體現(xiàn)出調(diào)試的重要性,畢竟它占據(jù)你“大部分”的時間。

為了真實的體現(xiàn)出它的重要性,我“引經(jīng)據(jù)典”,找來了幾個資深行業(yè)經(jīng)驗的大佬用引用他們的話來表述:

  1. 調(diào)試技巧比編碼技巧     更為重要,因為花費在調(diào)試上的時間往往比編碼還多,學(xué)到的東西比編碼中學(xué)到的更豐富
  2. 調(diào)試技能重要性甚?     超過學(xué)習(xí)?門語?
  3. 不會調(diào)試的程序員,     肯定編制不出任何好的軟件

我把關(guān)鍵詞都加粗劃重點了,其重要性可見一斑。大佬尚且這么認為,何況是我等?所以,本文好好閱讀O(∩_∩)O哈哈~ 

什么是斷點?

突然被這么一問,是不是腦袋懵懵的?

IDEA如何調(diào)試debug  

一個天天都在用的“東西”,若是真要你對它下個定義說給別人聽,估計一時半會還解釋不清。當然嘍,大道至簡,領(lǐng)會其要義能熟練使用才是硬道理。本文作為一篇“嚴肅”的技術(shù)文章,自然需要先把斷點這個概念用文字描述出來。

斷點:為了調(diào)試而故意讓程序暫停的地方。它是一種附加在源代碼上面的特殊標記,在debug模式下可以觸發(fā)特定動作,如暫停執(zhí)行、打印線程堆棧、計算表達式的值、變量跟蹤等等。斷點的設(shè)置和取消全人為手動管理,若不手動處理(刪除)將會和項目一直存在。

?  

如果你看過前兩篇文章,一定能解釋為何它會一直存在項目里。建議你前往參閱,電梯直達

?  

可見,斷點的核心要義是暫停程序,從而在暫停那時刻就可以看到上線文的變量情況、IO情況、線程情況等信息,進而更深入的了解程序,及時發(fā)現(xiàn)問題和追蹤到錯誤的根源。 

斷點參數(shù)

斷點并不是孤立存在的,它也可以有參數(shù),從而定制出不同的斷點行為,讓其能在不同條件下生效,這個參數(shù)就叫斷點參數(shù)。

我們平時用得比較多的條件斷點,它就是斷點參數(shù)的最典型應(yīng)用。當然除了條件斷點,其它的斷點類型也是可以定制化參數(shù)的。那到底有哪些斷點類型可以使用和定制呢?那么接下來就步入到本文主體內(nèi)容,開始進入更有意思的部分啦。 

斷點的基本使用

應(yīng)該沒人不會打斷點吧,即使你是產(chǎn)品經(jīng)理(產(chǎn)品經(jīng)理莫名躺槍,手動狗頭~)。

打斷點最簡單最直接的方式就是在你想設(shè)置斷點的哪一行代碼的最左邊窗欄鼠標左鍵單擊一下,完成后能看到一個小紅點,就表示斷點設(shè)置成功啦,再點擊一下就取消。形如這樣:

IDEA如何調(diào)試debug 

因為我的IDEA界面簡潔,盡可能的去掉了“按鈕”,所以平時我自己是使用到大量的快捷鍵來操作IDEA,打斷點也是如此經(jīng)常用快捷鍵去完成。當然嘍,很多時候也用鼠標的啦,畢竟鼠標處理還是有其很大優(yōu)勢的。

?  

說明:我的快捷鍵是Ctrl + Shift + B,僅供給你參考

?    

管理斷點

管理斷點包括新增、刪除斷點。

對于少量斷點來講,鼠標一個個的點擊給它刪除掉是可以的。但若打了“大量”的斷點在代碼里(比如看xxx源碼的時候),這時讓去一個個找來刪除是不太現(xiàn)實的,畢竟你可能自己都忘了哪兒有斷點。這個時候一個管理頁面/窗口就顯得格外的重要了,在IDEA中提供了這樣的窗口,你有多種方式打開它:

  1. 菜單欄方式:Run -> view breakpoints,缺點是路徑太長太麻煩
  2. Actions方式:雙擊shift調(diào)出Actions窗口,輸入view breakpoints即可打開
  3. 任意斷點處鼠標右鍵:選擇more即可打開管理窗口。缺點是:你至少得找到一個斷點作為抓手(當然嘍你可以任意處隨意打一個點進去也成)
  4. 調(diào)試窗口:該打開方式下面會提到
  5. 快捷鍵方式:毫無疑問,這是我最為推薦的方式嘍
IDEA如何調(diào)試debug  

在這個管理頁面,你可以對斷點進行增刪改。

?  

說明:我的快捷鍵是Ctrl + Shift + F8,僅供給你參考

?     

如何debug模式運行?

額,這講得是不是有點過于簡單了點。

啟動Debug模式運行的方式有多種,比如工具欄的蟲子小圖標按鈕、程序方法入口左鍵點擊、菜單欄、右鍵菜單欄等等,下面簡單演示下:

Gif太大了放不上來,查閱地址:https://img-blog.csdnimg.cn/20210128073454666.gif

據(jù)我了解,很多同學(xué)最常用的方式是點擊上方工具欄右上角的蟲子圖標,因為我“沒有”這個圖標,所以“教程”中就不演示了。A哥平時99%情況下都是使用快捷鍵方式啟動程序,因為我認為那是最迅速和便捷的(當然不一定適合你)。

此功能我的快捷鍵分為兩大類

  1. 運行右上角當前選中的入口類。它有一組快捷鍵
    1. Ctrl + Shift + Alt + enter:Run運行
    2. Ctrl + Shift + Alt + \:Debug運行
  2. 因為很多時候需要從     新的入口啟動程序,做Spring Boot工程開發(fā)可能體會不到(入口只有一個),但在做教程、Demo的時候程序入口是經(jīng)常變化的,所以不可能每次都還人肉去改啟動類,效率太低。為此我就新設(shè)置了這組快捷鍵
    1. Ctrl + Shift + Alt + [:Run運行,      鼠標焦點所在作為入口
    2. Ctrl + Shift + Alt + ]:Debug運行,      鼠標焦點所在入口

另外,若要區(qū)分本次是Run運行還是Debug運行,除了看右上角小蟲子圖標外,更好的方式看底部控制臺窗口激活的是哪個。這樣看的優(yōu)點是:即使同一份應(yīng)用啟動多次,也能快速看出來哪些debug哪些run。IDEA如何調(diào)試debug

IDEA如何調(diào)試debug  
Debug模式運行

值得一提的是:debug模式運行,若沒有任何斷點被激活(比如你壓根就沒打斷點),效果和run模式啟動是一樣(但控制臺窗口不一樣,因此日志輸出的位置也就不一樣)。 

調(diào)試窗口詳解

調(diào)試窗口是我們斷點調(diào)試的操作面板,熟練的使用此面板推提高效率和掌握更多技巧非常重要。先來認識下它:

IDEA如何調(diào)試debug  

此操作面板上按鈕不少,對Debug調(diào)試有多熟練很大程度上是由操作此面板的熟練度決定的。 

調(diào)試按鈕

最常用的一排按鈕,入門必備。

IDEA如何調(diào)試debug  

一共9個按鈕,從左往右依次解釋下: 

1.IDEA如何調(diào)試debugShow Execution Point:回到當前激活的斷點處。效果:若你鼠標現(xiàn)在在別的頁面/別的類上面,點擊它快速“歸位” 

2.IDEA如何調(diào)試debug Step Over步過:也叫單步調(diào)試,一行一行往下走,若這一行是方法也不會進入里面去。這個應(yīng)該是平時使用得最多的按鈕了,沒有之一。所以,建議記住你的快捷鍵來提高效率哈 

3.IDEA如何調(diào)試debugStep Into步入:進入方法體內(nèi)部。這里的方法指的你自定義的方法or三方庫的方法,不會進入到JDK官方的方法里(如上面的System.out.println()這種它是不會進去的) 

4.IDEA如何調(diào)試debugForce Step Into強制步入:能進入任何方法,包括JDK的。一般查看底層源碼才會用到它 

5.IDEA如何調(diào)試debugStep Out步出:它是搭配(Force) Step Into一起使用的,當通過step into進入到方法體內(nèi)部想出來時,一般有兩種方案:單步調(diào)試慢慢出來,另一個就是step out(推薦) 

6.IDEA如何調(diào)試debugDrop frame:回到當前方法的調(diào)用處,同時上下文內(nèi)所有的變量的值也回到那個時候。該按鈕能夠點擊的前提條件是:當前所處的方法有上級方法,如果你是main方法里,那么按鈕就是灰色嘍 

7.IDEA如何調(diào)試debugRun to Cursor運行到光標處:你想要代碼在哪里停一下,就把光標放在哪就成。這個功能實在太好用了,大大緩解了密密麻麻的斷點,強烈推薦 

8.IDEA如何調(diào)試debug

Evaluate Expression表達式計算器:看圖標就是個計算器嘛,所以你可以在這里執(zhí)行任何合法的表達式

IDEA如何調(diào)試debug  

IDEA如何調(diào)試debugTrace Current Stream Chain跟蹤當前Stream流:只有代碼停在Stream流語句上,此圖標才點亮可以被點擊。這是IDEA提供的由于調(diào)試Stream流的殺手锏級別的功能,放在文下詳細解釋

這一排按鈕非常重要,甚至是最重要,一定要熟練掌握,可以大大提高調(diào)試代碼的效率,親測有效。 

服務(wù)按鈕

把最左邊一豎排定義為服務(wù)按鈕,為調(diào)試過程提供服務(wù)。

IDEA如何調(diào)試debug  

一共10個,但都比較簡單和好理解。同樣的從上到下過一遍:

  1. Rerun xxx:關(guān)閉當前程序,重新運行
  2. Modify Run Configuration:顧名思義,修改運行的配置。點擊此按鈕的效果同點擊右上角的框框:
IDEA如何調(diào)試debug  

點擊會彈出這個配置窗口:

IDEA如何調(diào)試debug  

每份運行期配置都是具名且唯一的,互相隔離。運行配置可修改的項非常多,大概如下:

?  

說明:我截圖的頁面可能和你不一樣,因為我用的是最新版的IDEA,此頁面在2020.3版本做了改版

?  
IDEA如何調(diào)試debug  
  1. Resume Program:恢復(fù)程序。當斷點激活時程序“停止”了,點擊這個按鈕就是恢復(fù)的意思。它給到的效果是:     跳到下一個斷點(用這句話解釋貌似更容易理解些),若后面沒有斷點就直接運行結(jié)束了。這個按鈕     非常常用。
  2. Pause Program:暫停程序。嗯,只要你現(xiàn)在“卡”在斷點處,那么狀態(tài)就是Pause的狀態(tài)。這時候就有疑問了,難道這個按鈕一直是灰色不可點狀態(tài)?有啥用呢?我網(wǎng)絡(luò)上看了看,幾乎     沒人能夠解釋它的作用,這里A哥嘗試給你解釋下,用張圖給你整得明明白白,服服帖帖:
IDEA如何調(diào)試debug  
  1. Stop xxx:不解釋

  2. View Breakpoints:打開斷點管理窗口。文上已詳細解釋了此窗口的用法

  3. Mute Breakpoints:這個按鈕挺有意思的,作用是讓所有斷點變?yōu)榛疑?,也就是說讓它們失效。它是一個批量操作,操作對象是所有斷點,而不可針對于某一個。若你現(xiàn)在不想把所有斷點刪除,但又不想它們阻攔你,那么可用這個按鈕實現(xiàn)

  4. Get Thread Dump:拿到當前線程的dump,可以查看到當前線程的狀態(tài)。如下圖:IDEA如何調(diào)試debug

    IDEA如何調(diào)試debug      
    子線程當前狀態(tài)為Runnable
  5. Settings:打開設(shè)置菜單。屬于高級使用,每一項開啟后有什么效果,放在文下解釋

IDEA如何調(diào)試debug  
  1. Pin tab:如果你這會調(diào)試xxx這個程序很頻繁,那么把它“釘”上會更有助于效率提升 

方法調(diào)用棧

顯示當前方法(位于棧頂)所經(jīng)過的所有方法。

IDEA如何調(diào)試debug  

說明:點擊右上角的小漏斗圖標可以不顯示類庫的方法,只顯示你自己寫的方法,方便調(diào)試 

變量區(qū)Variables

在此區(qū)域可以查看當前斷點上下文范圍內(nèi)的所有變量值(即使不在本類內(nèi)也可以點過去查看哦),包括static靜態(tài)的。

IDEA如何調(diào)試debug  

值得注意:此區(qū)域里的變量IDEA會自動調(diào)用其toString()方法,因此若你遇到正常運行只輸出一句日志,debug輸出多句這種case很可能就是這個情況哦。 

Watches變量跟蹤

有的時候變量很多,而只需要重點關(guān)注某幾個變量,就可以使用Watches。

IDEA如何調(diào)試debug  

除了以上這些,還有什么動態(tài)改變變量值set Value,跳轉(zhuǎn)到源碼處jump to source等都是非常實用的功能,這就留你自己開發(fā)和實驗哈。 

為何調(diào)試窗口沒自動打開?

有同學(xué)遇到過這個情況:明明斷點激活了(程序暫停了),但是那個“操作面板”并沒有出來,怎么破?

話不多說,檢查你的這個配置項是勾選狀態(tài)即可。這個狀態(tài)IDEA默認是勾選上的,一般不用操心。

IDEA如何調(diào)試debug  
 

斷點調(diào)試的奇淫巧技

最后,站在使用層面,介紹些非常實用的“奇淫巧技”給你,這些小技巧可拿來就用。

強制返回(中斷debug)

場景描述:調(diào)試時,當我走到第三步就發(fā)現(xiàn)了問題,這個時候并不希望走完后續(xù)流程(比如因為前面有bug后續(xù)流程會有刪除數(shù)據(jù)操作等等),這個時候怎么處理?

咔嚓,Stop程序。是的,很長一段時間里我也是這么干的,確實能達到目的。直到我發(fā)現(xiàn)了一個更優(yōu)雅的方法:Force Return,效果為:強制返回方法返回值(自己給個值)來避免后續(xù)的流程。

IDEA如何調(diào)試debug    

條件斷點

指定斷點的激活條件,都能稱作條件斷點。一般情況下,在行斷點下給定一個計算表達式,結(jié)果為true就激活斷點這是最常用的方式。因為上面已有案例,這里省略

多線程調(diào)試

多線程程序的好處固然不用多說,但總所周知它調(diào)試起來是比較困難的,比如這段:

public static void main(String[] args) {
    // 共放3個"令牌"
    CyclicBarrier cyclicBarrier = new CyclicBarrier(3);

    // 模擬多個線程去搶
    for (int i = 0; i < 10; i++) {
        new Thread(() -> {
            try {
                String name = Thread.currentThread().getName();

                System.out.println(name + ",準備搶令牌");
                cyclicBarrier.await();
                System.out.println(name + ",已搶到");
            } catch (Exception e) {
            }
        }, "線程" + i).start();

    }

}
 

這個時候如果你想研究await()方法的實現(xiàn),需要具備的前提條件是多個線程進入,因此需要hold住多個線程。若只是在await()這一行打個普通的行斷點,那結(jié)果是這樣子的:

IDEA如何調(diào)試debug  

所有線程都是Running狀態(tài),顯示這是不可能的,因為總共只有3個另外,拿完了其它的都得等待才對,所以這個根本就不是真實的執(zhí)行場景,也就不可能跟蹤到await()方法里面去探究其實現(xiàn)。

為了模擬出這種場景進行調(diào)試,就對斷點阻塞條件設(shè)置為這樣:

IDEA如何調(diào)試debug  

再次運行程序,線程情況如下:

IDEA如何調(diào)試debug    

快速計算表達式

都知道調(diào)試面板里的Evaluate Expression可以計算表達式/變量的值,但那畢竟還得彈個窗稍顯麻煩,其實還有更為方便的方式:

IDEA如何調(diào)試debug  

用鼠標操作,效率指數(shù)級提升。這個操作方式是:鼠標指針選中表達式(IDEA智能自動選中) + 鼠標左鍵單擊。當然嘍,如果你想執(zhí)行自定義的不存在于代碼中的表達式,那必須調(diào)起窗口來操作。

Stream流調(diào)試

Java 8的流行,徹底讓流式編程走進我們的視野。使用Stream編程的好處眾多,但一直被大家詬病的是難以閱讀和難以調(diào)試,特別是后者。

為了調(diào)試它,我們經(jīng)常需要插入其它斷點,并分析流中的每個轉(zhuǎn)換,不可為不麻煩。還好IDEA提供了處理該痛點的“能力”:當調(diào)試器在Stream API調(diào)用鏈之前或之內(nèi)停止時,點擊Trace Current Stream Chain這個圖標即可以“非常好看”的圖形化方式展示出來,一目了然:

IDEA如何調(diào)試debug    

主動拋出異常

需求場景:你寫了一個全局異常組件,現(xiàn)在想測試它生效情況如何,那么時候你就需要主動拋出這種異常,一般的做法是形如這樣:

// 自己在程序內(nèi)主動throw一個
throw new NullPointerException();

// 或者構(gòu)建個表達式
int i = 1/0;
 

這種做法均有一定的代碼侵入性,用后還得刪除。其實IDEA還提供了一種更為優(yōu)雅的解決方案:

IDEA如何調(diào)試debug  

掌握了IDEA斷點調(diào)試的基本技能,下面進入到本文深水區(qū):斷點類型。難度不高,依舊是使用層面的事,但由于很多同學(xué)并不知道,因此是用于你超車的好材料。

四大斷點類型

對于打斷點,估計大部分同學(xué)都只會左邊鼠標單擊這種最基礎(chǔ)的方式。所以,看到這個小標題估計你得再懵一次吧。what?斷點還有種類?

若你也是只在代碼左邊鼠標單擊打上“小紅點”,然后嘎嘎就是干,空中轉(zhuǎn)體720度向后翻騰三周半......一把唆的選手,那么接下來就坐穩(wěn)嘍,準備發(fā)車。

IDEA如何調(diào)試debug  

這么個姿勢也許能幫你定位50%以上的問題,但還有另外一半的case呢?如for循環(huán)調(diào)試,Stream流調(diào)試,lambda調(diào)試、異常調(diào)試等這些場景,用那“一把唆”的方式就很難搞定甚至說搞不定了。斷點是幫我們快速定位問題的,不同的場景打上合適的斷點將能事半功倍。

殊不知,IDEA給我們開發(fā)者提供了非常的斷點類型,以應(yīng)對不同場景下的調(diào)試。在對應(yīng)的場景下使用合適正確的斷點類型,能夠大大提高調(diào)試的效率,從而別人加班你下班,效率就是時間,而時間就是生命。

IDEA如何調(diào)試debug  

如圖,IDEA把斷點分為四大類型(截圖中只有三類):

  1. Line breakpoint(行斷點):圖中紅色小圓圈。顧名思義,在指定代碼行設(shè)置斷點
  2. Field watchpoint(屬性斷點):圖中紅色小眼睛。打在類的屬性(static or 非static)上的斷點,作用是在該屬性     讀取和寫入時激活
  3. Method breakpoint(方法斷點):圖中紅色小菱形。標記在方法簽名的那一行,在該方法執(zhí)行的入口/出口處被激活
  4. Exception breakpoint(異常斷點):紅色小閃電。這是一個特殊但很好用的斷點,當程序拋出     指定異常時會激活異常斷點。和其它斷點不同,異常斷點是項目     全局的,它不需要打在具體某一行上

下面就到了“啃硬骨”的時候了,來吧。 

行斷點Line breakpoint

使用得最最最廣泛的斷點類型,平時大部分情況下都使用此種斷點。

Gif太大了放不上來,查閱地址:https://img-blog.csdnimg.cn/20210128011543377.gif

從“教程”中可以看到該斷點有很多的設(shè)置項,也就是有很多的斷點參數(shù)可以配置,來了解下。 

斷點參數(shù)

因為這是第一個介紹斷點參數(shù)的類型,因此會說得詳細些,這樣子后面相同功能的參數(shù)就不用再贅述了。對照這個截圖頁:

IDEA如何調(diào)試debug  
  • Enabled:不解釋。但需注意:若此項不勾選上,小紅點并不會消失,而是由實心的變?yōu)?     空心的,當然嘍,一般情況下并不會動此項
  • Suspend:眾所周知,斷點激活時會阻塞程序的繼續(xù)運行,從而阻塞當前線程。但是當你發(fā)現(xiàn)它是個復(fù)選框的時候,有沒有被詫異到?并且,并且,并且你還可以根本就不勾選它,有何區(qū)別:
    • All(默認):阻塞該程序內(nèi)所有線程

    • Thread:只阻塞當前斷點所在線程IDEA如何調(diào)試debug

      如上圖,不勾選Suspend:線程14和線程15正常運行,“暢通無阻”

    • Gif太大了放不上來,查閱地址:https://img-blog.csdnimg.cn/20210128062330308.gif

    • 如上圖,勾選Suspend-All:在斷點處,所有線程都被阻塞了,統(tǒng)一給我等待。

    • 若不勾選選中:此斷點相關(guān)活動(如打日志等)依舊正常進行,只是      不阻塞進程
    • 若勾選中:
IDEA如何調(diào)試debug  
      如上圖,勾選Suspend-Thread:method1的線程被阻塞,但是并不影響另外一個線程調(diào)用method2。
 

試想一下,既然“勾選Suspend-Thread”影響更小,那為何IDEA默認幫你選擇All而不是Thread呢?原因是這樣子的:調(diào)試的目的就是讓程序“慢下來”,最好是靜止下來方便分析問題。否則,其它線程如果仍舊繼續(xù)保持執(zhí)行的話,可能一會這個請求改掉這個數(shù)據(jù)一會改掉那個數(shù)據(jù),增加了不可控性。不確定的增加從而大大增加調(diào)試難度和定位問題的難度,所以索性上個“同步鎖”來得省心,因此默認選中Suspend-All是合理為之。

?  

說明:很多時候我們需要用本機連接測試環(huán)境打斷點進行遠程調(diào)試,若在這個case下強烈建議你使用Thread模式,否則你懂的

?  
  • Condition:斷點被激活的條件。你可以在此處書寫表達式,只有表達式返回     true時此斷點才會被激活
    • 條件斷點嚴格來講不屬于一種斷點類型,屬于斷點參數(shù)決定的,很多類型的斷點都可加條件
IDEA如何調(diào)試debug  
  • Log:它有三個選項,是checkbox哦。也就是說可都選,也可都不選,默認一個都不選
    • Breakpoint hit message:斷點激活時輸出提示日志
    • Stack trace:斷點激活時輸出程序調(diào)用棧信息
    • Evaluate and log:選擇需要輸出計算表達式的值。你可選擇當前可達的變量,如本例的main函數(shù)入?yún)rgs等
  • remove once hit:斷點激活一次后就立馬給移除嘍,也就是所謂的臨時行斷點,下面來介紹下它

還有窗口里最右邊的這塊條件:

IDEA如何調(diào)試debug  

見名之意,一系列過濾器:過濾實例、過濾類、過濾調(diào)用者等等,一般這些們幾乎不會使用(至少我目前是還沒用過的),所以就一筆帶過。 

使用場景

行斷點一般配合單步調(diào)試一起使用,在看框架源碼、定位基礎(chǔ)問題等使用得特別多,是最需要掌握的一種斷點類型,沒得商量。

臨時行斷點Temporary line breakpoint

它也屬于行斷點的一種,只是參數(shù)不一樣而已。由于它比較特殊,所以單摘出來說道說道。創(chuàng)建普通行斷點,然后把Remove once hit復(fù)選框勾選上即是一個臨時行斷點,效果如下:

IDEA如何調(diào)試debug  

這種斷點類型,實際使用場景其實很少。 

屬性斷點Field watchpoint

此類斷點是打在屬性上的,成員屬性和靜態(tài)屬性均可。它不是小紅點,而是個紅色“小眼睛”。

IDEA如何調(diào)試debug    
斷點參數(shù)
IDEA如何調(diào)試debug  

如圖,此種斷點類型特有個watch參數(shù),兩個可選值的含義為:

  • Filed Access:讀取此屬性時(寫入時不管)
  • Filed madification:寫入此屬性時(讀取時不管)
使用場景

當想知道xxx屬性的賦值是誰時,由于程序太龐雜沒法知道斷點打哪兒從哪開始跟蹤,這個時候使用屬性類型的斷點一下子就搞定了,非常的方便。

方法斷點Method breakpoint

斷點必須打在方法簽名的那一行,顏色形狀是個紅色的小菱形。

IDEA如何調(diào)試debug    
斷點參數(shù)
IDEA如何調(diào)試debug  

Watch有三個可選值:

  • Emulated:仿真。作用:提高調(diào)試性能,因此默認情況下使用。官方建議:僅在調(diào)試遠程代碼或在沒有行號信息的native方法或     類中設(shè)置斷點時,才建議禁用此選項
  • Method entry:進入方法時激活斷點
  • Method exit:出去方法時激活斷點
?  

若entry和exit都勾選,那在進入之后和出去之前都會激活斷點

?     
使用場景

對于此種斷點類型,可能你會說沒啥卵用。畢竟自己在方法頭尾打個行斷點就能達到同樣效果,沒必要單獨搞個類型嘛。

其實,它的殺手锏級使用場景是把此種類型斷點打在接口方法上,這樣子不管哪個實現(xiàn)類方法被調(diào)用,都會激活斷點,是不是特別給力。 

異常斷點Exception breakpoint

比較小眾,但并不代表不重要。在我理解它比較小眾,可能大多數(shù)同學(xué)不知道如何打一個異常斷點,因為它不是鼠標單擊就能輕松搞定。

上面介紹了異常斷點它是一種全局斷點類型,因此并不能在代碼處直接單擊,而是只能在管理窗口里統(tǒng)一添加:

IDEA如何調(diào)試debug  

和其它斷點類型相比,至少有如下不一樣:

  1. 創(chuàng)建斷點只能通過斷點管理窗口創(chuàng)建,而不能通過鼠標點擊方式
  2. 創(chuàng)建完成后,代碼欄處不會有任何顯示(沒有紅色小圖標),直到它被激活時才會出現(xiàn)紅色小閃電
  3. 異常斷點作用于全局:本例中任何地方拋出了NullPointException都會激活此斷點 
斷點參數(shù)
IDEA如何調(diào)試debug  

Notification有兩個可選值:

  • Catch excetion:只有當你自己try-catch了這個異常才會激活斷點
  • Uncatch excetion:只有當你自己不try-catch時才會激活斷點

默認情況下這兩個都會被勾選上,也就是說任何情況下發(fā)生此異常,都會激活斷點。 

使用場景

知曉了異常斷點的作用和觸發(fā)條件,使用場景就有啦。比如當你的程序拋出了一個異常,但是一時半會你并不知道是哪行代碼引起的,這個時候通過增加異常斷點的方式可以實現(xiàn)迅速的問題定位。

4種斷點圖標對比

每種斷點類型都有自己對應(yīng)的圖標,且有不同的狀態(tài)。我從官網(wǎng)趴了一張對比圖,總結(jié)得特別好,在這里一并分享給你:

IDEA如何調(diào)試debug    

遠程調(diào)試(遠程Debug)

現(xiàn)在大都是微服務(wù)架構(gòu)方式,每個微服務(wù)一般會有N多個上/下游依賴,如此以至于給調(diào)試帶來了很大困難,畢竟你幾乎不可能在本地同時把依賴都啟起來用IDEA做調(diào)試。所以,遠程調(diào)試來了,它是調(diào)試分布式系統(tǒng)的一個利器。

遠程調(diào)試:顧名思義,使用本地IDEA調(diào)試遠程代碼(一般為QA環(huán)境,線上環(huán)境不可能開啟調(diào)試端口的)。那么如何開啟遠程調(diào)試呢? 

開啟步驟

開啟遠程調(diào)試只需要兩步即可:

第一步:讓遠程部署的那個應(yīng)用支持遠程調(diào)試,也就是暴露遠程調(diào)試端口。方式方法為在應(yīng)用啟動時加上對應(yīng)的JVM參數(shù)即可,JDK版本不同參數(shù)也不一樣

  • JDK 9+:-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:${debug_port}
  • JDK 5-8:-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=${debug_port}
  • JDK 4:-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=${debug_port}
  • JDK 3-:-Xnoagent -Djava.compiler=NONE -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=${debug_port}

第二步:用IDEA創(chuàng)建一個remote運行配置,填上遠程主機的ip + 暴露的調(diào)試端口即可。操作路徑為:Edit Configurations -> Add New Configuration ->

IDEA如何調(diào)試debug  

萬事俱備,點擊debug運行,控制臺里能看到如下字樣就證明你鏈接成功了:

IDEA如何調(diào)試debug  

值得注意的是:遠程調(diào)試時請確保你本地代碼和遠程代碼一模一樣,已達到最佳效果。

 

傳統(tǒng)Tomcat如何開啟遠程調(diào)試?

若你是個Spring Boot應(yīng)用,那么在jar -jar時加上JVM參數(shù)即可,那么如果是要使用傳統(tǒng)的tomcat方式部署呢?這個時候找到傳統(tǒng)tomcat的啟動腳本startup.sh

#!/bin/sh
os400=false

...

PRGDIR=`dirname "$PRG"`
EXECUTABLE=catalina.sh

...

exec "$PRGDIR"/"$EXECUTABLE" start "$@"
 

為了加上咱們的JVM參數(shù),只需要在exec xxx之前添加一個變量值即可(以JDK8為例):

JPDA_OPTS='-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=具體的端口號’
 
?  

注意:這個key名稱必須是JPDA_OPTS。

?  

有好奇心的你可能不禁就要問了:為何加個JPDA_OPTS參數(shù)就行了呢?也沒見exec xxx使用它呀,其實不然,下面簡單解釋下,不展開。

exec執(zhí)行時引用了變量 $EXECUTABLE,它代表的是就是catalina.sh這個文件,該文件里面有大量變量判斷腳本,當然包括負責(zé)對JPDA_OPTS解釋:

#!/bin/sh

cygwin=false
darwin=false
...
if [ "$1" = "jpda" ] ; then
  if [ -z "$JPDA_TRANSPORT" ]; then
    JPDA_TRANSPORT="dt_socket"
  fi
  if [ -z "$JPDA_ADDRESS" ]; then
    JPDA_ADDRESS="localhost:8000"
  fi
  if [ -z "$JPDA_SUSPEND" ]; then
    JPDA_SUSPEND="n"
  fi
  if [ -z "$JPDA_OPTS" ]; then
    JPDA_OPTS="-agentlib:jdwp=transport=$JPDA_TRANSPORT,address=$JPDA_ADDRESS,server=y,suspend=$JPDA_SUSPEND"
  fi
  CATALINA_OPTS="$JPDA_OPTS $CATALINA_OPTS"
  shift
fi
...

感謝各位的閱讀,以上就是“IDEA如何調(diào)試debug”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對IDEA如何調(diào)試debug這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

當前題目:IDEA如何調(diào)試debug
URL分享:http://bm7419.com/article24/jjsece.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃Google、建站公司、服務(wù)器托管、搜索引擎優(yōu)化、網(wǎng)站導(dǎo)航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運營