Intellij IDEA的一些調(diào)試技巧(小結(jié))
程序員的工作內(nèi)容,除了大部分時間寫代碼之外,因為有不少的時間是用在調(diào)試代碼上。甚至說不是在調(diào)試代碼,就是即將調(diào)試代碼。 :)
今天我們來談?wù)務(wù){(diào)試代碼的一些技巧,在使用IDE提供的debugger時一些快速定位問題的方式。
看到這里的朋友,不要馬上認(rèn)為我標(biāo)題黨,再往下看看,如果你還有一些更好用的技巧,歡迎留言。
下面進(jìn)入正題。
1 多線程調(diào)試
開發(fā)過多線程應(yīng)用的朋友應(yīng)該有體會,有些時候,為了觀察多個線程間變量的不同狀態(tài),以及鎖的獲取等,就會想到在代碼里加個斷點debug一下。
在IDE里斷點停下來的時候,可以切換到另外的線程中,跑其他的代碼,不會互相影響。當(dāng)然,這里是有個開關(guān)的,在Eclipse里默認(rèn)開啟,
但是在IntelliJ IDEA里默認(rèn)是沒有開啟的。也就是說如果你在IDEA里代碼里加斷點,雖然一個線程的斷了下來,但其他線程的已經(jīng)執(zhí)行過了。
此處把線程的suspend設(shè)置成和Eclipse模式一樣之后,也可以開始多線程應(yīng)用的調(diào)試。
簡單設(shè)置可以直接在斷點處,將suspend改成Thread

更改IDEA中的默認(rèn)設(shè)置:切換到"Thread" Radio Button,點擊出現(xiàn)的按鈕 ”Make Default"

一個線程斷下來之后,可以通過在線程窗口切換,到其它線程中繼續(xù)運(yùn)行。
IntelliJ IDEA里在這兒切換
我們看到main線程和pool-1-thread-1這兩個線程都處于RUNNING狀態(tài),切換到任何一個都可以繼續(xù)運(yùn)行。
此時,就可以寫一個多線程的應(yīng)用,同時向ArryList這一類非線程安全的容器中存放內(nèi)容,然后觀察為什么他們是線程不安全的,會出現(xiàn)什么問題,生動又形象。
PS: 這里順道說一下,這就是為什么創(chuàng)建線程時建議起一個有意義的名字 ,至少是可以識別的名字,否則在這里都不能區(qū)分出哪個是自己的線程,想切換還麻煩。
2 后退執(zhí)行
這里所說的后退執(zhí)行,是有些時候我們在debug代碼時,懶的每個方法都進(jìn)入單步調(diào)試,就會出現(xiàn)你觀察一個變量值的變化時,某個方法沒跟進(jìn)去,結(jié)果值就變了,不得不重來一次。
依靠后退執(zhí)行的功能,可以后退,就像下棋時悔棋那種功能一樣。當(dāng)然,這個后退操作的名字是我自己起的,在IDE里被稱為Drop Frame。
有了這個功能,我們在Drop 了當(dāng)前這個Frame之后,已經(jīng)改變的變量值不會恢復(fù)。比如你向當(dāng)前調(diào)用方法里傳入了一個List,并且在方法中向List里添加了內(nèi)容,那在Drop到調(diào)用該方法的地方時,List不會恢復(fù)到之前的狀態(tài)。
但是在該方法再次被調(diào)用時,你可以觀察List什么時候被改變的,至少不需要再重跑一遍程序了。甚至你可以一言不合就后退。
3 條件斷點
為了調(diào)試代碼,就需要在要觀察變更的地方添加斷點,然后小心翼翼的一步步執(zhí)行。
但是如果是在一個循環(huán)里,又或者該方法會被多線程同時調(diào)用到的時候,你小心的向下單步調(diào)試,發(fā)現(xiàn)沒有你關(guān)心的內(nèi)容,又從循環(huán)開始處跑下來,還是沒你的內(nèi)容,人就開始煩燥起來。
其實,在添加斷點的時候,我們可以為斷點增加一定的條件,這樣,在指定的條件滿足時,斷點才會生效。
IntelliJ IDEA內(nèi),在斷點上右擊,會彈出如下圖的條件框,輸入指定的條件即可。
有了條件斷點,不相關(guān),不感興趣的代碼就可以直接跳過了。
4 片斷代碼
這個沒想好用什么名字來表述。有些時候在調(diào)試過程中,忽然想招待一段與此相關(guān),但不在源文件中的代碼來觀察一下,輔助進(jìn)行問題分析。此時你會停止程序,添加代碼然后重新跑一次嗎?
在IDEA里有一個執(zhí)行代碼片斷的功能,可以在當(dāng)前代碼的上下文內(nèi),執(zhí)行你臨時寫的代碼。
例如,當(dāng)前方法傳入一個List,但這個方法里少一個你后面條件需要使用到的元素,此時你可以臨時使用片斷代碼執(zhí)行的功能,添加一個進(jìn)去。
注意,在IntelliJ IDEA里,這個上面紅框,像個小計算器的按鈕就是臨時執(zhí)行的功能,點擊之后,會彈出按鈕下方這個Evaluate Expression(Ctrl+F8)的框,輸入代碼,點擊右下角的Evalute即可。返回值會顯示在Result處。
這就就相當(dāng)于臨時改變了變量內(nèi)容。
然后,還可以調(diào)用對象的方法,執(zhí)行功能,獲取屬性值等。
5 查看變量修改值
每個IDE在調(diào)試代碼時都提供了一個觀察當(dāng)前上下文變量值的窗口。其實除了查看之外,一些非final的基本類型,還可以直接在此處修改值。這樣如果多次循環(huán)執(zhí)行時,每次可以恢復(fù)到期望的值,不需要重啟程序。

常用代碼自動補(bǔ)全快捷鍵
| 快捷鍵 | 說明 |
|---|---|
| sout | System.out.println(“”); |
| psvm | main方法 |
常用設(shè)置項
常用快捷鍵
| 快捷鍵 | 說明 |
|---|---|
| Alt + Ctrl + S | 打開Settings |
| Alt + Ctrl + Shift + S | 打開Project Structrue |
| Alt + Enter | 快速修復(fù) |
| Alt + / | 單詞自動補(bǔ)全 |
| Alt + Insert | 代碼自動生成,比如setter、getter、toString等等 |
| Alt + Shift + V | 把類中成員移動到另一個類 |
| Ctrl + Shift + F | 格式化代碼 |
| Ctrl + Shift + U | 大小寫切換 |
| Ctrl + Shift + I | 根據(jù)當(dāng)前上下文顯示代碼定義,比如:光標(biāo)停在方法上就會以popupview方式顯示該方法的定義 |
| Ctrl + click | 跳到源碼 |
| Shift + Shift | 搜索所有文件 |
| Ctrl + E | 打開最近訪問文件列表 |
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
如何使用SpringBoot集成Kafka實現(xiàn)用戶數(shù)據(jù)變更后發(fā)送消息
Spring Boot集成Kafka實現(xiàn)用戶數(shù)據(jù)變更后,向其他廠商發(fā)送消息,我們需要考慮配置Kafka連接、創(chuàng)建Kafka Producer發(fā)送消息、監(jiān)聽用戶數(shù)據(jù)變更事件,并將事件轉(zhuǎn)發(fā)到Kafka,本文分步驟給大家講解使用SpringBoot集成Kafka實現(xiàn)用戶數(shù)據(jù)變更后發(fā)送消息,感興趣的朋友一起看看吧2024-07-07
collection集合體系與并發(fā)修改異常的解決方法
今天小編就為大家分享一篇關(guān)于collection集合體系與并發(fā)修改異常的解決方法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-03-03
Intellij IDEA 添加jar包的三種方式(小結(jié))
這篇文章主要介紹了Intellij IDEA 添加jar包的三種方式(小結(jié)),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-08-08
Java的Hibernate框架中的雙向主鍵關(guān)聯(lián)與雙向外鍵關(guān)聯(lián)
Hibernate想要實現(xiàn)雙向的關(guān)聯(lián)就必須在映射文件的兩端同時配置<one-to-one>,另外還要在主映射的一端采用foreign外鍵關(guān)聯(lián)屬性,下面我們就一起來看一下Java的Hibernate框架中的雙向主鍵關(guān)聯(lián)與雙向外鍵關(guān)聯(lián)方法:2016-06-06
Spring?MVC和springboot靜態(tài)資源處理問題
這篇文章主要介紹了Spring?MVC和springboot靜態(tài)資源處理問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08

