遠程debug調試java代碼

來源:互聯網
上載者:User

標籤:win   bsp   虛擬   ica   記憶體   block   start   體繫結構   nec   

遠程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。

 

 

遠程debug調試java代碼

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.