前言
上一篇文章
IntelliJ IDEA 高階除錯之Stream Trace
算是 IntelliJ IDEA 高階除錯技巧的開胃菜,小夥伴們被這個小技巧征服,趁熱打鐵,今天給大家帶來幾個大家
日常工作
以及
閱讀原始碼
必備的高階除錯技巧
斷點處新增 log
很多程式設計師在除錯程式碼時都喜歡
一些內容,這樣看起來更直觀,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 + 滑鼠左鍵
,就會彈出下面的內容
勾選上
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
兩個選項
如果修改欄位值的方法比較多,也可以在
Condition
的地方定義斷點進入條件, 有了這個功能的加成,相信你閱讀原始碼會順暢許多
異常斷點
除了閱讀原始碼,一定是遇到了異常我們才開始除錯程式碼,程式碼在丟擲異常之後會自動停止,但是我們希望:
程式碼停在丟擲異常之前,方便我們檢視當時的變數資訊
這時我們就用到了
Exception Breakpoints
, 當丟擲異常時,在 catch 的地方打上斷點,可以透過下圖的幾個位置獲取棧頂異常型別,比如這裡的
NumberFormatException
知道異常型別後,就可以按照如下步驟新增異常斷點了:
然後在彈框中選擇 NumberFormatException
重新以 Debug 模式執行程式:
程式「一路綠燈式」定位到丟擲異常的位置,同時指出當時的變數資訊,三個字:穩,準,狠,還有誰?
方法斷點
當閱讀原始碼時,比如 Spring,一個介面的方法可能被多個子類實現,當執行時,需要檢視呼叫棧逐步定位實現類,IDEA 同樣支援在介面方法上新增斷點(快捷鍵
cmd+F8
/
ctrl+F8
):
滑鼠左鍵在方法處點選斷點(♦️形狀)
斷點上滑鼠右鍵
勾選上綠色框線上的內容,同樣可以自定義跳轉條件 Condition
當以 Debug 模式執行程式的時候,會自動進入實現類的方法(
注意斷點形狀
):
看到這你應該想到常見的 Runnable 介面中的 run 方法了,同樣是有作用的,大家可以自行去嘗試了
總結
相信有以上四種除錯技巧的加成,無論是工作debug 還是私下閱讀原始碼,都可以輕鬆駕馭了。最後,來看看 IDEA 支援的各種斷點除錯型別,如果你只知道紅色小圓點,那咱在留言區好好說說吧
趣味原創解析Java技術棧問題,將複雜問題簡單化,將抽象問題圖形化落地如果對我的專題內容感興趣,或搶先看更多內容,歡迎訪問我的部落格
dayarch。top