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