遠程debug調試java代碼

遠程debug調試java代碼

平常環境和預發環境遇到問題時,能夠用遠程調試的方法本地打斷點,在本地調試。生產環境因爲網絡隔離和系統穩定性考慮,不能進行遠程代碼調試。java

總體過程是經過修改遠程服務JAVA_OPTS參數,而後本地經過Eclipse或IDEA等工具調試。windows

下面簡單介紹下理論。tomcat

 

理論

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爲例。eclipse

主動鏈接調試:服務端配置監控端口,本地IDE鏈接遠程監聽端口進行調試,通常調試問題用這種方式。socket

被動鏈接調試:本地IDE監聽某端口,等待遠程鏈接本地端口。通常用於遠程服務啓動不了,啓動時鏈接到本地調試分析。工具

 

主動鏈接調試

首先須要遠程服務配置啓動腳本:post

JAVA_OPTS="$JAVA_OPTS -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000"

若是是啓動jar包,指令:ui

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。

相關文章
相關標籤/搜索