IDEA远程调试Java代码
文章目錄
- 1 前言
- 2 遠程 Debug 調試原理
- 2.1 理論基礎
- 2.2 遠程調試分類
- 3 主動連接調試
- 3.1 遠程服務中開啟 Debug 服務
- 3.1.1 對于 SpringBoot
- 3.1.2 對于 Tomcat
- 3.2 IDEA 中指定 Debug 服務器
- 3.3 遠程服務器防火墻端口放行
- 4 被動連接調試
- 4.1 對于 Tomcat
- 4.2 對于 SpringBoot
- 5 開始調試
- 6 關閉調試
1 前言
當我們的代碼在線上/測試環境運行出現異常需要進行問題定位時,之前的傳統做法是:查看異常日志,根據日志定位到出錯代碼,然后再根據相關參數及異常信息進行推斷。但是很多異常問題需要更細致的進行debug才能夠更精準的去定位和解決,這種情況下,我們希望能夠像在本地調試一樣去debug線上/測試環境的代碼,這樣可以大大提升bug修復的效率。IDEA 遠程調試為我們提供了解決方案,像運行本地代碼一樣調試遠程主機上的程序,以排查遠程程序的BUG或代碼執行流程。
2 遠程 Debug 調試原理
在本地遠程調試服務器端的代碼原理:本地和服務器端建立一個socket連接監聽,當客戶端訪問服務器的時候,服務器端會先去問本地idea有沒有斷點,如果有會停在當前斷點,如果沒有就返回給客戶端。
2.1 理論基礎
JPDA(Java Platform Debugger Architecture)是Java平臺調試體系結構的縮寫。由3個規范組成,分別是JVMTI(JVM Tool Interface),JDWP(Java Debug Wire Protocol),JDI(Java Debug Interface) 。
- 1.JVMTI定義了虛擬機應該提供的調試服務,包括調試信息(Information譬如棧信息)、調試行為(Action譬如客戶端設置一個斷點)和通知(Notification譬如到達某個斷點時通知客戶端),該接口由虛擬機實現者提供實現,并結合在虛擬機中
- 2.JDWP定義調試服務和調試器之間的通信,包括定義調試信息格式和調試請求機制
- 3.JDI在語言的高層次上定義了調試者可以使用的調試接口以能方便地與遠程的調試服務進行交互,Java語言實現,調試器實現者可直接使用該接口訪問虛擬機調試服務。
2.2 遠程調試分類
遠程調試分為主動連接調試,和被動連接調試。
主動連接調試:服務端配置監控端口,本地IDE連接遠程監聽端口進行調試,一般調試問題用這種方式。
被動連接調試:本地IDE監聽某端口,等待遠程連接本地端口。一般用于遠程服務啟動不了,啟動時連接到本地調試分析。
3 主動連接調試
3.1 遠程服務中開啟 Debug 服務
3.1.1 對于 SpringBoot
命令行添加選項,并重啟,注意新參數必須在 -jar 之前
java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 -jar springbootfirst.jar3.1.2 對于 Tomcat
啟動腳本中添加選項,并重啟:
## sudo vim $CATALINA_HOME/bin/catalina.sh JAVA_OPTS="$JAVA_OPTS -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005"3.2 IDEA 中指定 Debug 服務器
-
點擊主窗口菜單 Run / Edit Configurations,打開Run/Debug Configurations窗口;
-
點擊工具欄上的+按鈕,下拉菜單中選擇Remote;
-
設置 Host 為遠程服務器的域名或IP,保持 Port=5005 無需調整;
-
Use module classpath配置為程序模塊名稱;
-
Command line arguments for remote JVM配置:配置Debug遠程服務的命令行啟動參數,
形如 -Xdebug -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005,參數說明如下:
- -Xdebug:JVM在DEBUG模式下工作;
- -Xrunjdwp:JVM使用(java debug wire protocol)來運行調試環境;
- transport:監聽Socket端口連接方式,常用的dt_socket表示使用socket連接;
- server:=y表示當前是調試服務端,=n表示當前是調試客戶端;
- suspend:=n表示啟動時不中斷(如果啟動時中斷,一般用于調試啟動不了的問題);
- address:表示本地監聽的地址和端口。
3.3 遠程服務器防火墻端口放行
如果調試服務器與遠程服務器網絡不相通則需要開放端口
### sudo vim /etc/sysconfig/iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 5005 -j ACCEPT ### 重啟生效: sudo systemctl restart iptables4 被動連接調試
首先需要IDEA配置監聽,如主動連接調試的IDEA配置圖片,Debugger mode選擇:Listen to remote JVM,配置本地監聽端口,比如默認5005。點擊Debug開始等待遠程連接調試。
4.1 對于 Tomcat
配置遠程服務啟動腳本:
JAVA_OPTS="$JAVA_OPTS -Xdebug -Xrunjdwp:transport=dt_socket,address=127.0.0.1:5005,suspend=y"4.2 對于 SpringBoot
命令行添加選項,并重啟,注意新參數必須在 -jar 之前
java -Xdebug -Xrunjdwp:transport=dt_socket,address=127.0.0.1:5005,suspend=y -jar springbootfirst.jar參數含義和主動連接調試一樣,只是這里suspend=y表示啟動時就中斷,需要連接本地IDE調試啟動。address=ip:port,ip需要修改為本地的對外IP。
這樣遠程項目啟動時就連接到本地,方便調試項目啟動不了的問題。
5 開始調試
- 要求:雙方代碼一致,否則遠程調試無法啟動;
- 本地啟動剛剛配置的 Remote Server,正常時會看到日志: Connected to the target VM, address: 'xxx:5005', transport: 'socket'
- 本地 IDEA 代碼中設置斷點
- 瀏覽器或手機 HTTP 訪問服務器
- IDEA 即可在斷點暫停并跟蹤
6 關閉調試
服務器上多開放個端口是不安全的,調試完畢后可恢復防火墻設置。
Java 服務器關閉 Debug 服務器的功能,因為debug會影響性能。
總結
以上是生活随笔為你收集整理的IDEA远程调试Java代码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python实现3d建模工具_Pytho
- 下一篇: 8个绝对不能错过的PPT免费素材网站