上一篇文章 IntelliJ IDEA 高級調試之Stream Trace 算是 IntelliJ IDEA 高級調試技巧的開胃菜,小夥伴們被這個小技巧征服,趁熱打鐵,今天給你們帶來幾個你們平常工做以及閱讀源碼必備的高級調試技巧html
不少程序員在調試代碼時都喜歡 print
一些內容,這樣看起來更直觀,print 完以後又很容易忘記刪除掉這些沒用的內容,最終將代碼提交到 remote
,code review 時又不得不刪減這些內容從新提交,不但增長沒必要要的工做量,還讓 log tree
的一些節點沒有任何價值java
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 + 鼠標左鍵
,就會彈出下面的內容shell
勾選上 Evaluate and log
, 並自定義你想查看的 log/變量,好比這裏的 "interested" + i
, 這樣以 Debug 模式運行程序(正常模式運行,不會打印這些 log):dom
interested 7 interested 5 interested 1 interested 2 interested 0 Found 2 interested values
若是你在多處添加了這種斷點,簡單的看 log 可能偶爾仍是不夠直觀,能夠勾選上面圖片綠色框線的 "Breakpoint hit" message
:socket
Breakpoint reached at top.dayarch.TestDebug.isInterested(TestDebug.java:49) interested 6 Breakpoint reached at top.dayarch.TestDebug.isInterested(TestDebug.java:49) interested 0 Breakpoint reached at top.dayarch.TestDebug.isInterested(TestDebug.java:49) interested 9 Breakpoint reached at top.dayarch.TestDebug.isInterested(TestDebug.java:49) interested 8 Breakpoint reached at top.dayarch.TestDebug.isInterested(TestDebug.java:49) interested 1 Found 3 interested values Disconnected from the target VM, address: '127.0.0.1:0', transport: 'socket' Process finished with exit code
若是你想要更詳細的信息,那就勾選上 Stack trace
(你們本身查看運行結果吧),有了這個功能,上面說的一些問題都不復存在了ide
若是你閱讀源碼,你必定會有個困擾,類中的某個字段的值究竟是在哪裏改變的,你要一點點追蹤調用棧,逐步排查,稍不留神,就可能有遺漏lua
咱們能夠在 IntelliJ IDEA 中爲某個字段添加斷點,當字段值有修改時,自動跳到相應方法位置
使用起來很簡單:idea
Field access
和 Field modification
兩個選項若是修改字段值的方法比較多,也能夠在 Condition
的地方定義斷點進入條件, 有了這個功能的加成,相信你閱讀源碼會順暢許多spa
除了閱讀源碼,必定是遇到了異常咱們纔開始調試代碼,代碼在拋出異常以後會自動中止,可是咱們但願:
代碼停在拋出異常以前,方便咱們查看當時的變量信息
這時咱們就用到了 Exception Breakpoints
, 當拋出異常時,在 catch 的地方打上斷點,能夠經過下圖的幾個位置獲取棧頂異常類型,好比這裏的 NumberFormatException
知道異常類型後,就能夠按照以下步驟添加異常斷點了:
而後在彈框中選擇 NumberFormatException
從新以 Debug 模式運行程序:
程序「一路綠燈式」定位到拋出異常的位置,同時指出當時的變量信息,三個字:穩,準,狠,還有誰?
當閱讀源碼時,好比 Spring,一個接口的方法可能被多個子類實現,當運行時,須要查看調用棧逐步定位實現類,IDEA 一樣支持在接口方法上添加斷點(快捷鍵 cmd+F8
/ctrl+F8
):
勾選上綠色框線上的內容,一樣能夠自定義跳轉條件 Condition
當以 Debug 模式運行程序的時候,會自動進入實現類的方法(注意斷點形狀):
看到這你應該想到常見的 Runnable 接口中的 run 方法了,一樣是有做用的,你們能夠自行去嘗試了
相信有以上四種調試技巧的加成,不管是工做debug 仍是私下閱讀源碼,均可以輕鬆駕馭了。最後,來看看 IDEA 支持的各類斷點調試類型,若是你只知道紅色小圓點,那咱在留言區好好說說吧
日拱一兵 | 原創