IntelliJ - Debug 的使用方法

古古

2020/02/15


1. 什麼是 Debug 模式? #

還記得以前不會使用 IntelliJ 的 debug 功能時,想要看某個 Variable 的值,都是在那行 code 的下面一行加上 System.out.println(),然後運行程式,把值 print 出來,如果要看另一個 Variable,我就再加一行 System.out.println(),所以到後來我的 code 就會長的像下圖這樣

public User getMaleUser() {
    List<User> userList = userDao.getUserList();
    System.out.println(userList); // print userList,看一下userList裡面的內容長怎樣

    // 從userList中取出男生,然後回傳
    User resultUser;
    for (User user : userList) {
        if (user.getGender() == "男") {
            resultUser = user;
        }
    }

    System.out.println(resultUser); // 再print resultUser,確認一下回傳的user到底是哪一個

    return resultUser;
}

可想而知,這樣做的開發效率是非常差的,每多看一個 variable 就要多增加一行 System.out.println(),而且每次改了之後,都要重新運行程式,讓程式再 print 出一次數據,我想想都覺得痛苦,難道 IntelliJ 就沒有一個能夠快速反應出現在這個 variable 的值是什麼的功能嗎?

事實上,IntelliJ 是有提供的!當我們在運行程式時,改成使用 Debug 模式 運行就可以了!

2. IntelliJ 的 Debug 模式 #

使用 IntelliJ 的 Debug 模式來運行程式的好處

  • 可以一行行的運行 code
  • 可以馬上知道運行中的 variable 的值,甚至去改變它的值,從此不用再使用System.out.println()去 print variable 了

在 IntelliJ 的 Debug 模式中,有幾個比較重要的功能面板如下

  1. 開啟 Debug 模式的開關,通常在寫 code 時都會改用 Debug 模式來跑程式,已經很少使用旁邊的 Run 模式了
  2. 設置 break point,在左邊行號欄單擊左鍵就可以設置 break point,再點一下則可以取消此 break point,能夠設置 break point 是 Debug 模式和 Run 模式最大的區別,而設置 break point 可以幫助我們一行行的運行 code,這也是為什麼推薦使用 Debug 模式而不是使用 Run 模式
  3. Debug 按鈕,debug 的主要功能就對應著這幾個按鈕
  4. Service 按紐,和 break point 有關係,主要搭配著 3. Debug 按鈕 一起使用
  5. Variables,可以查看當前 break point 之前的 variable 的值

3. Debug 基本用法 #

IntelliJ 的 Debug 模式基本用法主要對應著上述 3 和 4 的兩組按鈕

Debug 按鈕,從左到右共 8 個按鈕 #

  1. Show Execution Point : 如果你在看其它行或其它頁面,點擊這個按鈕可跳轉到當前代碼執行的地方
  2. Step Over : 一行一行的往下執行 code,如果這一行裡面有 call 其他方法的話,不會進入那些方法
  3. Step Into : 如果當前行有 call 其他方法,可以進入該方法內部,一般用於進入自定義方法內,不會進入 library 的方法
  4. Force Step Into : 強制進入方法內部,能進入任何方法,查看底層 source code 的時候可以用這個進入 library 的方法
  5. Step Out : 退出方法,從進入的方法內退出到方法調用處,此時方法已執行完畢,只是還沒有完成賦值
  6. Drop Frame : 回退 break point,很少用到
  7. Run to Cursor : 運行到目前滑鼠點擊的位置,你可以將滑鼠點擊到你需要查看的那一行,然後使用這個功能,code 就會運行至那一行,而不需要在那一行上打 break point(前提是已經進入了 Debug 模式,就是已經停在某個 break point 上了)
  8. Evaluate Expression : 計算表達式,後面第五部分詳細說明

Service 按鈕,從上到下共 7 個按鈕 #

  1. Rerun : 重新運行程式,他會關閉程式後再重新啓動一次,不過很少用到,通常都會直接關掉,再手動開啟一次
  2. Update ’tech’ application : 更新程式,就是執行當初定義的 update 選項,當 Debug 模式啟動後,再次點擊 debug 按鈕也會跳出此選項
  3. Resume Program : 繼續執行程序,例如在第 20 行和 25 行有兩個 break point,而當前運行至第 20 行,按一下,則運行到下一個 break point(即第 25 行),再按一下,則運行完整個流程,因爲後面已經沒有 break point 了
  4. Pause Program : 暫停程式,很少用,不是很重要
  5. Stop : 連續按兩下關閉程式,有時候你會發現關閉程式再啓動時,說 port 被佔用,這是因爲沒完全關閉程式的原因
  6. View Breakpoints : 查看所有 break point,後面第七部分詳細說明
  7. Mute Breakpoints : 將所有 break point 變爲灰色並使它們失效,按 Resume Program 那個鍵(也就是第三個按鍵)可以直接運行完程式(因為所有打的 break point 都被設置為無效了),再次點擊這個 Mute Breakpoints 按鍵可以使所有無效 break point 變爲紅色有效

4. Debug 模式下的 variable 查看 #

在 Debug 過程中,跟蹤查看 variable 的值是非常必要的,有幾個方式可以查看當前 variable 的值

  1. 參數所在行後面會顯示當前 variable 的值
  2. 滑鼠停到參數上,會顯示當前 variable 的資訊,點擊打開可以看到該 variable 的詳情
  3. 在下方的 Variables 窗口查看,這裡會顯示當前方法的所有 variable 的詳情

5. 計算表達式 Evaluate Expression #

在前面第三部分有提到一個計算表達式 Evaluation Expression 按鈕,可以使用這個按鈕在 debug 過程中計算某個表達式的值,或是直接改變某個 variable 的值,而不用再去重新改 code 然後再重啟程式

假設在 Debug 模式下,想要快速比較當前 list.get(0).equals("first") 的結果,可以不用改 code,直接在計算表達式裡面運算,讓 IntelliJ 快速幫助我們計算出這個函式會回傳的值,非常方便,像是下面的 3. Result 部分,得到的就是使用計算表達式運行 list.get(0).equals("first") 的結果

或是說想要更改 variable 的值的話,也可以透過計算表達式來改變,像是下面這個例子,對 code 來說,list 裡只會有 first、second 兩個字串,但是因為我們在計算表達式裡使用了 list.add("third") 向 list 插入一個新的 Object third,所以下方 Variables 變量區才會顯示 list 裡面有三個字串 first、second、third

題外話說一下,如果只是單純想要改變 variable 的值的話,還有另一種方法,不用透過計算表達式那麼麻煩。只要在 Variables 在直接對想要改的 variable 上點右鍵,使用 setValue 也能重新改變此 variable 的值的

6. Break point 條件設置 #

有的時候在 for loop 一個集合或是數組的時候,可能只想要看 for loop 裡面的某個 i 值超過多少以上的 variable 情況,這時候就可以透過設置 break point 條件來達成,也就是說,只有在滿足了 break point 的條件時,才會停在該 break point 上,不然就會直接忽略此 break point

對 break point 點擊右鍵可以設置 break point 條件,像是下圖是設置成在 i=3 時才停下(如果沒有設置 break point 條件的話,則每進一次for loop,每個 i 都會停一次 break point)

7. 查看所有的 break point #

在左下方點擊 View Breakpoints 可以查看目前已經設置的所有 break point,有時候自己 break point 打多了很容易忘記打在哪,可以透過這個功能知道自己都在哪些地方打了 break point,取消勾選可以使此 break point 失效

8. 設置異常 break point #

當設置異常 break point時,在程式中出現需要攔截的異常時,會自動定位到 throw exception 的那行

設置方式一樣是先點擊 view breakpoints,之後點擊 + 號添加異常 break point,這邊添加了一個 NullPointerException

當程式噴出 NullPointerException 時,IntelliJ 就會自動跳到拋出 NullPointerException 的那一行,省的我們再去定位問題點在哪,非常方便

9. 總結 #

本文列出了 IntelliJ 中 Debug 模式的實用用法,讓你在開發路上更順暢

不過要注意一點,因為 Debug 時會讓整個程式停在你打的 break point 上,所以千萬不能夠在 production 下 debug,只能夠在測試環境中進行 debug

有關 IntelliJ 中如何設置 remote debug,請參考我之前寫的這篇文章: IntelliJ - Remote Debug