遠程debug調試java代碼
日常環境和預發環境遇到問題時,可以用遠程調試的方法本地打斷點,在本地調試。生產環境由於網絡隔離和系統穩定性考慮,不能進行遠程代碼調試。
整體過程是通過修改遠程服務JAVA_OPTS參數,然后本地通過Eclipse或IDEA等工具調試。
下面簡單介紹下理論。
理論
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語言實現,調試器實現者可直接使用該接口訪問虛擬機調試服務。 java調試工具jdb,就是sun公司提供的JDI實現。eclipse IDE,它的兩個插件org.eclipse.jdt.debug.ui和org.eclipse.jdt.debug與其強大的調試功能密切相關,其中前者是eclipse調試工具界面的實現,而后者則是JDI的一個完整實現。
遠程調試
遠程調試分為主動連接調試,和被動連接調試。這里以Eclipse為例。
主動連接調試:服務端配置監控端口,本地IDE連接遠程監聽端口進行調試,一般調試問題用這種方式。
被動連接調試:本地IDE監聽某端口,等待遠程連接本地端口。一般用於遠程服務啟動不了,啟動時連接到本地調試分析。
主動連接調試
首先需要遠程服務配置啟動腳本:
JAVA_OPTS="$JAVA_OPTS -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000"
如果是啟動jar包,指令:
java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000 -jar test.jar
這里-Xdebug是通知JVM工作在DEBUG模式下,-Xrunjdwp是通知JVM使用(java debug wire protocol)來運行調試環境。transport是監聽Socket端口連接方式(也可以dt_shmem共享內存方式,但限於windows機器,並且服務提供端和調試端只能位於同一台機)。server=y表示當前是調試服務端,=n表示當前是調試客戶端。suspend=n表示啟動時不中斷(如果啟動時中斷,一般用於調試啟動不了的問題)。address=8000表示本地監聽8000端口。
遠程服務(tomcat/jboss)啟動成功后,本地Eclipse對需要調試的地方打上斷點,然后項目右鍵啟動遠程調試:Debug as->Debug Configurations->Remote Java Application。Host為遠程主機IP,Port為遠程監聽調試端口,Connection Type為:Standard(Socket Attach),如圖:
點擊Debug,然后打斷點,遠程服務運行到斷點處本地就會中斷,然后進行調試。
被動連接調試
首先需要Eclipse配置監聽,如主動連接調試的Eclipse配置圖片,Connection Type選擇:Standard(Socket Listen),配置本地監聽端口,比如默認8000。點擊Debug開始等待遠程連接調試。
然后配置遠程服務啟動腳本:
JAVA_OPTS="$JAVA_OPTS -Xdebug -Xrunjdwp:transport=dt_socket,address=127.0.0.1:8000,suspend=y"
如果是調試jar包,指令:
java -Xdebug -Xrunjdwp:transport=dt_socket,address=127.0.0.1:8000,suspend=y -jar remoting-debug.jar
參數含義和主動連接調試一樣,只是這里suspend=y表示啟動時就中斷,需要連接本地IDE調試啟動。address=ip:port,ip需要修改為本地的對外IP。
這樣遠程項目啟動時就連接到本地,方便調試項目啟動不了的問題。
總結
另外除了在啟動腳本如上配置外,還可以用這種方式配置:
啟動時:sh catalina.sh jpda start。修改啟動時是否中斷或本地監聽端口,設置變量值:JPDA_SUSPEND=y JPDA_ADDRESS=9999。