起飛,會了這4個 Intellij IDEA 除錯魔法,閱讀原始碼都簡單了

前言

上一篇文章

IntelliJ IDEA 高階除錯之Stream Trace

算是 IntelliJ IDEA 高階除錯技巧的開胃菜,小夥伴們被這個小技巧征服,趁熱打鐵,今天給大家帶來幾個大家

日常工作

以及

閱讀原始碼

必備的高階除錯技巧

斷點處新增 log

很多程式設計師在除錯程式碼時都喜歡

print

一些內容,這樣看起來更直觀,print 完之後又很容易忘記刪除掉這些沒用的內容,最終將程式碼提交到

remote

code review

時又不得不刪減這些內容重新提交,不但增加不必要的工作量,還讓

log tree

的一些節點沒有任何價值

IntelliJ IDEA 提供

Evaluate and Log at Breakpoints

功能恰巧可以幫助我們解決這個問題, 來看下面程式碼:

public static void main(String[] args) { ThreadLocalRandom random = ThreadLocalRandom。current(); int count = 0; for (int i = 0; i < 5; i++) { if (isInterested(random。nextInt(10))) { count++; } } System。out。printf(“Found %d interested values%n”, count); } private static boolean isInterested(int i) { return i % 2 == 0; }

假如我們想在第 15 行檢視每次呼叫,隨即出來的 i 的值到底是多少,我們沒必要在這個地方新增任何 log,在正常加斷點的地方使用快捷鍵

Shift + 滑鼠左鍵

,就會彈出下面的內容

起飛,會了這4個 Intellij IDEA 除錯魔法,閱讀原始碼都簡單了

勾選上

Evaluate and log

, 並自定義你想檢視的 log/變數,比如這裡的

“interested” + i

, 這樣以 Debug 模式執行程式(正常模式執行,不會列印這些 log):

interested 7interested 5interested 1interested 2interested 0Found 2 interested values

如果你在多處添加了這種斷點,簡單的看 log 可能偶爾還是不夠直觀,可以勾選上面圖片綠色框線的

“Breakpoint hit” message

Breakpoint reached at top。dayarch。TestDebug。isInterested(TestDebug。java:49)interested 6Breakpoint reached at top。dayarch。TestDebug。isInterested(TestDebug。java:49)interested 0Breakpoint reached at top。dayarch。TestDebug。isInterested(TestDebug。java:49)interested 9Breakpoint reached at top。dayarch。TestDebug。isInterested(TestDebug。java:49)interested 8Breakpoint reached at top。dayarch。TestDebug。isInterested(TestDebug。java:49)interested 1Found 3 interested valuesDisconnected from the target VM, address: ‘127。0。0。1:0’, transport: ‘socket’Process finished with exit code

如果你想要更詳細的資訊,那就勾選上

Stack trace

(大家自己檢視執行結果吧),有了這個功能,上面說的一些問題都不復存在了

欄位斷點

如果你閱讀原始碼,你一定會有個困擾,類中的某個欄位的值到底是在哪裡改變的,你要一點點追蹤呼叫棧,逐步排查,稍不留神,就可能有遺漏

我們可以在 IntelliJ IDEA 中為某個欄位新增斷點,當欄位值有修改時,自動跳到相應方法位置

使用起來很簡單:

在欄位定義處滑鼠左鍵新增斷點(會出現「眼睛」的圖示)

在「眼睛」圖示上滑鼠右鍵

在彈框中勾選上

Field access

Field modification

兩個選項

起飛,會了這4個 Intellij IDEA 除錯魔法,閱讀原始碼都簡單了

如果修改欄位值的方法比較多,也可以在

Condition

的地方定義斷點進入條件, 有了這個功能的加成,相信你閱讀原始碼會順暢許多

異常斷點

除了閱讀原始碼,一定是遇到了異常我們才開始除錯程式碼,程式碼在丟擲異常之後會自動停止,但是我們希望:

程式碼停在丟擲異常之前,方便我們檢視當時的變數資訊

這時我們就用到了

Exception Breakpoints

, 當丟擲異常時,在 catch 的地方打上斷點,可以透過下圖的幾個位置獲取棧頂異常型別,比如這裡的

NumberFormatException

起飛,會了這4個 Intellij IDEA 除錯魔法,閱讀原始碼都簡單了

知道異常型別後,就可以按照如下步驟新增異常斷點了:

起飛,會了這4個 Intellij IDEA 除錯魔法,閱讀原始碼都簡單了

然後在彈框中選擇 NumberFormatException

起飛,會了這4個 Intellij IDEA 除錯魔法,閱讀原始碼都簡單了

重新以 Debug 模式執行程式:

起飛,會了這4個 Intellij IDEA 除錯魔法,閱讀原始碼都簡單了

程式「一路綠燈式」定位到丟擲異常的位置,同時指出當時的變數資訊,三個字:穩,準,狠,還有誰?

方法斷點

當閱讀原始碼時,比如 Spring,一個介面的方法可能被多個子類實現,當執行時,需要檢視呼叫棧逐步定位實現類,IDEA 同樣支援在介面方法上新增斷點(快捷鍵

cmd+F8

/

ctrl+F8

):

滑鼠左鍵在方法處點選斷點(♦️形狀)

斷點上滑鼠右鍵

勾選上綠色框線上的內容,同樣可以自定義跳轉條件 Condition

起飛,會了這4個 Intellij IDEA 除錯魔法,閱讀原始碼都簡單了

當以 Debug 模式執行程式的時候,會自動進入實現類的方法(

注意斷點形狀

):

起飛,會了這4個 Intellij IDEA 除錯魔法,閱讀原始碼都簡單了

看到這你應該想到常見的 Runnable 介面中的 run 方法了,同樣是有作用的,大家可以自行去嘗試了

總結

相信有以上四種除錯技巧的加成,無論是工作debug 還是私下閱讀原始碼,都可以輕鬆駕馭了。最後,來看看 IDEA 支援的各種斷點除錯型別,如果你只知道紅色小圓點,那咱在留言區好好說說吧

起飛,會了這4個 Intellij IDEA 除錯魔法,閱讀原始碼都簡單了

趣味原創解析Java技術棧問題,將複雜問題簡單化,將抽象問題圖形化落地如果對我的專題內容感興趣,或搶先看更多內容,歡迎訪問我的部落格

dayarch。top