Intellij IDEA調(diào)試技巧的深入講解
前言
程序員的日常工作除了寫代碼之外,很大一部分時(shí)間將會(huì)在查找 BUG,解決問題。查找 BUG,離不開在 IDE 中調(diào)試代碼。熟練的掌握調(diào)試技巧,可以幫助我們減少查找時(shí)間,快速定位問題。
在 IDEA 中調(diào)試代碼很方便,只要開啟調(diào)試,在相應(yīng)代碼處使用斷點(diǎn),然后進(jìn)行相應(yīng)調(diào)試即可。正是因?yàn)橹灰莆者@幾個(gè)功能,就可以調(diào)試代碼,所以在很長(zhǎng)一段時(shí)間內(nèi),不了解其他調(diào)試技巧。后續(xù)深入使用 IDEA 過程中,不斷學(xué)會(huì) IDEA 其他調(diào)試技巧,很大程度上加快調(diào)試速度。
Step 系列按鈕
日常調(diào)試的過程中為了為了找到程序的bug,通常需要單步調(diào)試,一步一步跟蹤程序執(zhí)行的流程,根據(jù)變量的值,找到最終原因。
IDEA 中提供一系列 Step 功能按鈕用于單步調(diào)試,可以在 Run 菜單欄找到全部 Step 功能。
另外在調(diào)試窗口也可以找到,不過這里只會(huì)顯示一部分常用按鈕。
調(diào)試過程中,使用頻率最高的可能就是 Setp Over。Setp Over 可以單步調(diào)試代碼,但是當(dāng)碰到方法執(zhí)行時(shí),不會(huì)進(jìn)入方法內(nèi),直接調(diào)用了方法,然后到下一行。
如果需要進(jìn)入方法內(nèi),需要使用 Step Into 。Step Into 可以進(jìn)入調(diào)用的方法內(nèi),不過默認(rèn)情情況下并不會(huì)進(jìn)入 java.*
等類的方法中。如果需要進(jìn)入,可以在 Setting-Stepping
中設(shè)置,排除即可。。
另外還可以使用 Force Step Into,強(qiáng)制進(jìn)入。
當(dāng)碰到一行代碼調(diào)用多個(gè)方法時(shí),使用 Step Into 就比較蛋疼了。Step Into 會(huì)按照調(diào)用順序進(jìn)入調(diào)用的方法,但是往往我們只想進(jìn)入其中一個(gè)方法而已。
這種場(chǎng)景下我們可以使用 Smart Step Into ,選擇指定方法進(jìn)入。
有些情況下,在進(jìn)入一個(gè)方法后,可以使用 Setp Out,快速執(zhí)行方法,然后跳回到調(diào)用處。
另外在進(jìn)入 for/while 循環(huán)里面的后,如果不在循環(huán)代碼外面打斷點(diǎn)出來(lái),就需一步步隨著循壞代碼執(zhí)行結(jié)束,特別麻煩。在這里就可以使用 Setp Out Of Code Block,快速跳出循環(huán)代碼塊。
斷點(diǎn)使用技巧
臨時(shí)斷點(diǎn)
一般調(diào)試的時(shí)候,我們會(huì)在代碼行使用斷點(diǎn),然后運(yùn)行測(cè)試,等到程序遇到斷點(diǎn)暫停時(shí),查看相關(guān)變量?jī)?nèi)容。
在 IDEA 中,默認(rèn)斷點(diǎn)將會(huì)一直存在。有時(shí)候僅僅想需要暫停第一次,臨時(shí)查看,這個(gè)時(shí)候我們可以使用臨時(shí)斷點(diǎn)。使用快捷鍵 Ctel + Alt + Shift +F8 可以快速創(chuàng)建臨時(shí)斷點(diǎn)或者按住 ALt,然后再創(chuàng)建斷點(diǎn)。。
條件斷點(diǎn)
有時(shí)候我們?cè)谘h(huán)處理數(shù)據(jù)的過程中,可能只關(guān)心某個(gè)條件的數(shù)據(jù),這種情況下我們使用條件斷點(diǎn)。
右擊斷點(diǎn),彈出設(shè)置斷點(diǎn)屬性的窗口,我們就可以在 condition 處設(shè)置條件。IDEA 會(huì)在滿足這個(gè)條件時(shí)候,才會(huì)暫停程序。
另外設(shè)置的條件斷點(diǎn)樣式也會(huì)比較特殊,。
多線程斷點(diǎn)
在調(diào)試多線程的項(xiàng)目時(shí)候,如果在多個(gè)線程代碼處打上了斷點(diǎn),調(diào)試的時(shí)候你會(huì)發(fā)現(xiàn),只能串行的調(diào)試。
上面多線程程序,兩個(gè)線程啟動(dòng)之后,程序也許會(huì)在 thread1
暫停,也許會(huì)在 thread2
處暫停。只要任一個(gè)斷線暫停之后,另一處斷點(diǎn)線程就會(huì)被阻塞。這時(shí)只能調(diào)試完暫停處線程的斷點(diǎn),才能跳到第二處斷點(diǎn),調(diào)試起來(lái)非常不方便。
我們可以設(shè)置斷點(diǎn)線程屬性,改變這個(gè)特性。
我們可以在斷點(diǎn)上使用鼠標(biāo)右鍵彈出斷點(diǎn)設(shè)置框,在 Suspend 選擇 Thread 選項(xiàng)。重新啟動(dòng)上面的程序,然后在調(diào)試窗口 Frames 可以看到 thread1,thread2兩個(gè)線程。其中兩個(gè)線程均可進(jìn)入調(diào)試,此時(shí)程序調(diào)試位于 thread1 處。這時(shí)選擇框選擇thread2,就可以調(diào)試 thread2.
另外,斷點(diǎn)的多線程屬性可以設(shè)置默認(rèn)屬性,點(diǎn)擊 Make Default 按鈕,設(shè)置默認(rèn) Suspend屬性。
回退調(diào)試程序
調(diào)試的時(shí)候,有時(shí)候會(huì)進(jìn)錯(cuò)方法或者錯(cuò)過一個(gè)方法調(diào)用過程,這個(gè)時(shí)候往往只能重新開始從頭開始執(zhí)行調(diào)試一遍。從新開始調(diào)試,可能還需要設(shè)置相關(guān)參數(shù),修改數(shù)據(jù)庫(kù)狀態(tài)等,非常麻煩。所以如果在調(diào)試過程中可以回退就可以不用重新開始。
IDEA 中可以使用 Drop Frame 與 Force Return 回退調(diào)試程序。
Drop Frame
Drop Frame 字面意思為丟棧。JVM 中使用棧幀用于進(jìn)行方法調(diào)用數(shù)據(jù)結(jié)構(gòu),每次方法調(diào)用,對(duì)應(yīng)著一個(gè)棧幀在虛擬機(jī)中從入棧到出棧的過程。調(diào)用方法之后,該方法棧幀將會(huì)位于棧頂。
執(zhí)行 Drop Frame,丟棄棧頂棧幀,于是程序?qū)?huì)回到調(diào)用方法處。
調(diào)試上面的程序,在上面斷點(diǎn)處,使用 Drop Frame,就可以跳回方法調(diào)用處,即第三行。查看輸出窗口,發(fā)現(xiàn)并沒有任何輸出。
Drop Frame 可以在調(diào)試窗口欄找到。
注意與 Step Out 區(qū)別,執(zhí)行 Step Out,方法將會(huì)執(zhí)行結(jié)束之后再返回到調(diào)用處。
Force Return
Force Return 強(qiáng)制返回,可以在程序執(zhí)行到一半時(shí)強(qiáng)制返回結(jié)束程序??梢栽?Frames 找到。
點(diǎn)擊 Force Return,可以設(shè)置返回值。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
基于python locust庫(kù)實(shí)現(xiàn)性能測(cè)試
這篇文章主要介紹了基于python locust庫(kù)實(shí)現(xiàn)性能測(cè)試,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05Spring Boot Rest控制器單元測(cè)試過程解析
這篇文章主要介紹了Spring Boot Rest控制器單元測(cè)試過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03Springboot webscoket自定義定時(shí)器
這篇文章主要介紹了Springboot webscoket自定義定時(shí)器問題,總的來(lái)說這并不是一道難題,那為什么要拿出這道題介紹?拿出這道題真正想要傳達(dá)的是解題的思路,以及不斷優(yōu)化探尋最優(yōu)解的過程。希望通過這道題能給你帶來(lái)一種解題優(yōu)化的思路2023-01-01詳解如何在Java中使用阿里云對(duì)象存儲(chǔ)OSS
Java是世界上最流行的編程語(yǔ)言之一,擁有著廣泛的應(yīng)用場(chǎng)景和強(qiáng)大的生態(tài)系統(tǒng),阿里云對(duì)象存儲(chǔ) OSS 是一種企業(yè)級(jí)的云存儲(chǔ)服務(wù),本文將介紹如何在 Java 中使用阿里云對(duì)象存儲(chǔ) OSS,并寫一點(diǎn)相應(yīng)的代碼示例供大家參考2023-06-06IDEA MyBatis Plugins自動(dòng)生成實(shí)體類和mapper.xml
這篇文章主要介紹了IDEA MyBatis Plugins自動(dòng)生成實(shí)體類和mapper.xml,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07關(guān)于Java8 parallelStream并發(fā)安全的深入講解
這篇文章主要給大家介紹了關(guān)于Java8 parallelStream并發(fā)安全的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-10-10Springboot整合minio實(shí)現(xiàn)文件服務(wù)的教程詳解
這篇文章主要介紹了Springboot整合minio實(shí)現(xiàn)文件服務(wù)的教程,文中的示例代碼講解詳細(xì),對(duì)我們的工作或?qū)W習(xí)有一定幫助,需要的可以參考一下2022-06-06Mybatis實(shí)現(xiàn)一對(duì)一、一對(duì)多關(guān)聯(lián)查詢的方法(示例詳解)
這篇文章主要介紹了Mybatis實(shí)現(xiàn)一對(duì)一、一對(duì)多關(guān)聯(lián)查詢的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-04-04