文章目錄
1 概述
原理:本機和遠程主機的兩個 VM 之間使用 Debug 協議通過 Socket 通信,傳遞調試指令和調試信息
被調試程序的遠程虛擬機:作爲 Debug 服務端,監聽 Debug 調試指令。jdwp是Java Debug Wire Protocol的縮寫
調試程序的本地虛擬機:IDEA 中配置的 Remote Server,指定 Debug 服務器的Host:Port,以供 Debug 客戶端程序連接。
2 設置
2.1 IDEA 中指定 Debug 服務器
- 點擊主窗口菜單
Run / Edit Configurations
,打開“Run/Debug Configurations”窗口; - 點擊工具欄上的“+”按鈕,下拉菜單中選擇“Remote”;
- 設置 Host 爲遠程服務器的域名或IP,保持 Port=5005 無需調整;
- 複製命令行參數,形如
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
2.2 遠程服務中開啓 Debug 服務
2.2.1 對於 SpringBoot
命令行添加選項,並重啓:
## 注意新參數必須在 -jar 之前
jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar test.jar
2.2.2 對於 Tomcat
啓動腳本中添加選項,並重啓:
## sudo vim $CATALINA_HOME/bin/catalina.sh
JAVA_OPTS="$JAVA_OPTS -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005"
2.3 遠程服務器防火牆端口放行
### sudo vim /etc/sysconfig/iptables
-A INPUT -m state --state NEW -m tcp -p tcp --dport 5005 -j ACCEPT
### 重啓生效: sudo systemctl restart iptables
3 開始調試
- 要求:雙方代碼一致,否則遠程調試無法啓動;
- 本地啓動剛剛配置的 Remote Server,正常時會看到日誌:
Connected to the target VM, address: 'xxx:5005', transport: 'socket'
- 本地 IDEA 代碼中設置斷點
- 瀏覽器或手機 HTTP 訪問服務器
- IDEA 即可在斷點暫停並跟蹤
4 關閉調試
服務器上多開放個端口是不安全的,調試完畢後可恢復防火牆設置。
而 Java 服務器開啓 Debug 服務器的功能可以保留,以便之後再次調試。