IDEA Java程序調試
IntelliJ IDEA Java程序調試
1. 創建或打開一個Java項目
如果有需要調試的項目源碼,可以直接打開一個存在的項目,如果沒有項目源碼只有class或者jar文件的話需要在IDEA中添加jar到依賴庫。
2. 調試模式參數配置
Java應用程序可以在運行時添加啟動參數即可調試,需要注意的是不同的JDK版本的調試參數可能會不一樣。
JDK5-8:
-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005
JDK9+:
-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005
suspend=n表示的是啟動Java應用時是否立即進入調試模式,suspend=y表示啟動即暫停,suspend=n則表示啟動時不需要暫停。address=*:5005表示的是Debug監聽的服務地址和端口,根據需求修改,上述配置會監聽到0.0.0.0。
3. 在IDEA中啟用遠程調試
點擊工具欄的Add Configuration...,點擊左側的+號,選擇Remote,如下圖:

配置遠程Debug信息,填入遠程服務的IP地址、端口信息,注意JDK版本,JDK8+使用的調試參數是不一樣的,最后如果默認選擇的classpath不對需要手動選擇下classpath。

4. 遠程調試Java應用程序
以調試模式啟動Java應用也很簡單,只需要加上調試參數即可:
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005 Test
這個時候程序會處于等待狀態(光標會一致閃爍,等待遠程連接):

4.1 有源碼調試
假設我們有需要調試的應用程序代碼,我們可以直接在Java類上設置斷點即可調試。
示例 - Test.java:
/**
* Creator: yz
* Date: 2020-05-19
*/
public class Test {
public static void main(String[] args) {
System.out.println(args);
}
}
在待調試的程序點設置斷點,并點擊IDEA Debug配置:
這個時候就可以看到程序已經運行至斷點的位置了:

4.2 無源碼,只有jar或者class文件調試
如上示例,假設我們這個時候只有Test.class的class文件或者Test.class對應的test.jar文件,我們應該怎么調試呢?
只有class的情況下我們進入源碼所在的包,然后打包成jar文件即可:
cd src
jar -cvf test.jar *
ls -la
命令執行結果:
已添加清單
正在添加: Test.class(輸入 = 342) (輸出 = 187)(壓縮了 45%)
[yz@yz:src]$ ls -la
total 16
drwxr-xr-x 4 yz staff 128 May 19 17:21 .
drwxr-xr-x 5 yz staff 160 May 19 16:57 ..
-rw-r--r-- 1 yz staff 342 May 19 17:20 Test.class
-rw-r--r-- 1 yz staff 641 May 19 17:22 test.jar
這個時候統計目錄就會生成一個test.jar,我們只需要把這個jar添加到classpath然后設置好斷點就可以調試了。
添加jar到IDEA的classpath,可以直接選擇jar目錄或者jar文件然后右鍵Add as Library,也可以選擇項目以外的目錄或者jar文件。
示例 - 直接選擇項目中的jar:

示例 - 選擇項目以外的jar:

選擇jar需要添加的classpath信息,通常不需要修改:

啟動Test示例:
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005 -cp test.jar Test
展開test.jar并在Test.class中設置斷點,最后點擊工具欄的調試按鈕即可調試:


5. 調試Tomcat示例
常見的中間件啟動腳本中都內置了調試參數,如Tomcat的bin/catalina.sh就內置了調試參數:

但最簡單直接的方式是直接在Tomcat的啟動腳本catalina.sh(Windows換成catalina.bat)中添加Debug參數即可:
JAVA_OPTS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005"

然后再使用catalina.sh啟動Tomcat就會發現Tomcat會處于等待遠程連接狀態:

接下來就只需要導入Tomcat的jar并設置斷點就可以調試了。
添加Tomcat的lib目錄到IDEA的classpath:

展開左側External Libraries->lib->選擇需要斷點的類->點擊工具欄的Debug:

然后在webapps/ROOT目錄下新建一個test.jsp:
<%=request.getParameter("id")%>
最后點擊工具欄的Debug后控制臺的Tomcat就會自動啟動,知道觸發斷點為止,上圖示例中我設置的斷點是org.apache.catalina.connector.RequestFacade#getParameter,所以需要使用瀏覽器請求任意頁面并傳入參數(訪問http://localhost:8080/test.jsp?id=yzmm)即可進入斷點:

其實調試Tomcat最簡單的方式是直接啟動一個Maven Web項目并使用Tomcat啟動,然后在pom.xml中配置對應版本的Tomcat的依賴就可以直接Debug了,使用這種調試方法可以讓您學會如何使用IDEA調試任意的Java程序,僅此而已。
6. 條件斷點
某些時候我們需要設置一個斷點調試的時候會發現一些我們不希望關心的斷點也進來了,會比較影響Debug,這個時候我們可以使用IDEA的條件斷點的方式來設置斷點。先在對應的行設置一個斷點,然后再點擊斷點的紅點圖標右鍵設置斷點停止條件了。例如下圖示例我們設置一個當用戶名為admin時進入調試模式:

7. 動態獲取表達式值
調試模式時我們可以點擊下圖的計算器圖標或者使用快捷鍵?F8來執行任意的Java代碼片段,如下圖:

如果想要執行多行,點擊放大/縮小的小圖標切換:

8. 查看所有斷點、暫停/啟用所有斷點
如果斷點數量被設置的比較多,可能會比較難于管理,所幸,IDEA提供了對所有斷點批量管理的功能,點擊下圖的小圖標或者使用快捷鍵??F8即可批量管理所有斷點:

斷點批量管理功能,新版的IDEA還新增了異常斷點功能:

如果想要一次性放過所有的斷點而又不想一個個的去勾掉斷點,可以點擊紅色圓圈帶×的小圖標:

這樣就可以看到所有已被設置了斷點的圖標都變成了灰色,也就是暫停了所有斷點功能:

再次點擊該圖標就會恢復到調試模式。
9. 接口調試/成員變量值監控
在使用IDEA調試的時候可以把斷點設置到接口方法上,所有的接口實現類的被設置了斷點的方法都可以Debug,如下圖:

IDEA還支持對成員變量值進行監控,當被設置了監控的變量值發生改變時會進入斷點:

10. 代碼覆蓋率/性能
IDEA自帶了Coverage和CPU Profiling功能,運行程序的時候選擇對應的小圖標就可以看到測試結果了,如下圖:

Java Web安全
推薦文章: