首先java項目要支付可遠程調試獲得啓動時加入參數前端
啓動遠程調試java
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=可用於遠程調試端口
啓用JMX,遠程性能觀察後端
-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9999 #可用於遠程JMS端口 -Dcom.sun.management.jmxremote.ssl=false #是否採用SSL -Dcom.sun.management.jmxremote.authenticate=false #是否安全校驗 -Djava.rmi.server.hostname=10.10.9.221 #使用IP
eclipse配置安全
其中:host爲遠程java程序提供遠程調試的IP,post爲遠程java程序提供遠程調試的端口服務器
摘抄:http://www.ibm.com/developerworks/cn/opensource/os-eclipse-javadebug/網絡
遠程調試對應用程序開發十分有用。例如,爲不能託管開發平臺的低端機器開發程序,或在專用的機器上(好比服務不能中斷的 Web 服務器)調試程序。其餘狀況包括:運行在內存小或 CUP 性能低的設備上的 Java 應用程序(好比移動設備),或者開發人員想要將應用程序和開發環境分開,等等。架構
啓動配置 保存一組用於啓動程序的屬性。啓動配置類型是一種能夠在 Eclipse 平臺上啓動的獨特程序。eclipse
如 果您還沒安裝該程序,請下載 Eclipse V3.4(Ganymede)。在 Ganymede 中,套接字(socket)監聽鏈接器被添加到 Remote Java Application 啓動配置類型。Eclipse 最新的套接字監聽鏈接器容許您打開 Java 調試器,它可以監聽特定套接字上的鏈接。能夠從命令行選項打開被調試的程序,並將其鏈接到調試器。在 Ganymede 發佈以前,僅有一個鏈接套接字的鏈接器,被調試的程序所在的機器必須是一個與調試器相連的調試主機。因爲受到內存和 CPU 不足的限制,要想讓移動設備充當主機是不現實的。socket
爲了進行遠程調試,必須使用 Java Virtual Machine (JVM) V5.0 或更新版本,好比 IBM® J9 或 Sun Microsystem 的 Java SE Development Kit(JDK)。本文主要討論遠程調試,而不是每一個 Eclipse 調試特性的細節。查看 參考資料 得到更多關於使用 Eclipse 進行調試的信息,而且能夠找到上面提到的軟件。工具
JDI— Java 調試接口(Java Debug Interface)
JDT— Java 開發工具(Java Development Tools)
JDWP— Java 調試網絡協議(Java Debug Wire Protocol)
JPDA— Java 平臺調試器架構(Java Platform Debugger Architecture)
JVM— Java 虛擬機(Java Virtual Machine)
JVMDI— JVM 調試接口(JVM Debug Interface)
JVMTI— JVM 工具接口(JVM Tool Interface)
VM— 虛擬機(Virtual Machine)
Sun Microsystem 的 Java Platform Debugger Architecture (JPDA) 技術是一個多層架構,使您可以在各類環境中輕鬆調試 Java 應用程序。JPDA 由兩個接口(分別是 JVM Tool Interface 和 JDI)、一個協議(Java Debug Wire Protocol)和兩個用於合併它們的軟件組件(後端和前端)組成。它的設計目的是讓調試人員在任何環境中均可以進行調試。JPDA 不只可以用於桌面系統,並且可以在嵌入式系統上很好地工做。
JVM Tool Interface (JVMTI) 規定必須爲調試提供 VM(編輯注:從 Java V5 開始,將用 JVMTI 代替 Java V1.4 中的 JVMDI)。Java Debug Wire Protocol (JDWP) 描述調試信息的格式,以及在被調試的進程和調試器前端之間傳輸的請求,調試器前端實現 JDI,好比 Eclipse、Borland JBuilder 等。根據 Sun 的 JPDA 規範,被調試的程序經常稱爲 debuggee。JDI 是一個高級的接口,它定義用於遠程調試的信息和請求。下面給出了調試器的架構。
清單 1. Java 平臺調試器架構
Components Debugger Interfaces / |--------------| / | VM | debuggee -----( |--------------| <---- JVMTI - Java VM Tool Interface \ | back-end | \ |--------------| / | comm channel --( | <------------ JDWP - Java Debug Wire Protocol \ | / |--------------| / | front-end | debugger -----( |--------------| <---- JDI - Java Debug Interface \ | UI | \ |--------------|
所以,任何第三方工具和基於 JPDA 的 VM 應該都能協調工做。經過這個客戶機-服務器架構,您能夠從運行該平臺的本地工做站調試 Java 程序,甚至還能夠經過網絡進行遠程調試。
在 討論調試場景以前,咱們先了解 JPDA 規範中的兩個術語:鏈接器和傳輸。鏈接器是一個 JDI 抽象,用來在調試器應用程序和目標 VM 之間創建鏈接。傳輸定義應用程序如何進行訪問,以及數據如何在前端和後端之間傳輸。鏈接器 「映射」 到可用的傳輸類型和鏈接模式。在 Sun 的 JPDA 參考實現中,爲 Microsoft® Windows® 提供了兩個傳輸機制:套接字傳輸和共享內存傳輸。可用的鏈接器:
鏈接套接字鏈接器
鏈接共享內存鏈接器
監聽套接字鏈接器
監聽共享內存鏈接器
啓動命令行鏈接器
在調試器應用程序和目標 VM 之間創建鏈接時,有一端將用做服務器並監聽鏈接。隨後,另外一端將鏈接到監聽器並創建一個鏈接。經過鏈接,調試器應用程序或目標 VM 均可以充當服務器。進程之間的通訊能夠在同一個機器或不一樣的機器上運行。
要 遠程調試 Java 程序,難點不是在調試器的前端,而是遠程 Java 後端。不幸的是,Eclipse 幫助系統中爲這方面提供的信息並很少。事實上,JDI 和 JVMTI 是分別由 Eclipse 和 Java 運行時環境實現的。咱們僅須要考慮 JDMP,由於它包含與 JVMTI 和 JDI 進行通訊所需的信息。JDWP 包含許多參數,用於爲遠程 Java 應用程序調用所需的程序。如下是本文用到的一些參數。
-Xdebug
啓用調試特性。
-Xrunjdwp:<sub-options>
在目標 VM 中加載 JDWP 實現。它經過傳輸和 JDWP 協議與獨立的調試器應用程序通訊。下面介紹一些特定的子選項。
從 Java V5 開始,您可使用 -agentlib:jdwp 選項,而不是 -Xdebug 和 -Xrunjdwp。但若是鏈接到 V5 之前的 VM,只能選擇 -Xdebug 和 -Xrunjdwp。下面簡單描述 -Xrunjdwp 子選項。
transport
這裏一般使用套接字傳輸。可是在 Windows 平臺上也可使用共享內存傳輸。
server
若是值爲 y,目標應用程序監聽將要鏈接的調試器應用程序。不然,它將鏈接到特定地址上的調試器應用程序。
address
這是鏈接的傳輸地址。若是服務器爲 n,將嘗試鏈接到該地址上的調試器應用程序。不然,將在這個端口監聽鏈接。
suspend
若是值爲 y,目標 VM 將暫停,直到調試器應用程序進行鏈接。
要得到每一個調試設置的詳細解釋,請參考 JPDA 文檔(參見 參考資料)。
清單 2 是一個示例,顯示如何在調試模式下啓動 VM 並監聽端口 8765 的套接字鏈接。
清單 2. 做爲調試服務器的目標 VM
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8765
清單 3 顯示如何使用位於 8000 端口的主機 127.0.0.1 上的套接字鏈接運行中的調試器應用程序。
清單 3. 做爲調試客戶機的目標 VM
-Xdebug -Xrunjdwp:transport=dt_socket,address=127.0.0.1:8000
Eclipse 是一個圖形化 Java 調試器前端。JDI 在 org.eclipse.jdt.debug 包中實現。本文不詳細討論 JDI 實現。參見 參考資料 得到關於 Eclipse JDT 和 Java JDI 技術的信息。
咱們首先應該知道要使用哪一個 Eclipse 鏈接器。要了解 Eclipse 提供的遠程鏈接類型,您能夠轉到 Eclipse 菜單並選擇 Run > Debug Configurations...,在 Remote Java Application
中添加一個啓動配置,而後從下拉列表中選擇鏈接器。在 Ganymede 中共有兩個鏈接器:
Socket Attach
Socket Listen
對 於監聽套接字的鏈接器,Eclipse VM 將是與遠程 Java 應用程序鏈接的主機。對於鏈接套接字的鏈接器,目標 VM 將做爲主機。這兩種鏈接器對應用程序調試沒有影響,用戶能夠任意選擇。但根據經驗,須要使用速度更快、更強大的計算機做爲 VM 調試主機,由於須要計算的資源不少。
在調試 Java 應用程序以前,須要確保已經爲遠程應用程序啓用全部調試選項。若是選項信息不可用,您將收到一個錯誤信息,好比 「Debug information is not available」 或 「Unable to install breakpoint due to missing line number」。您能夠經過更改 Eclipse 菜單上的 Window > Preferences > Java > Compiler 來修改設置。
圖 1. Eclipse 中的調試選項
如今,咱們已經準備好遠程調試應用程序。咱們分步執行:
1. 使用簡單類建立一個 Java 項目
咱們爲調試建立一個簡單類。清單 4 給出了示例代碼。
清單 4. 調試示例代碼
package com.ibm.developerWorks.debugtest; public class test { public static void main(String[] args) { System.out.println("This is a test."); } }
2. 設置一個斷點
在代碼中設置一個斷點。在這個例子中,咱們在 System.out.println("This is a test.");
這行中設置斷點。
圖 2. 在 Eclipse 中設置斷點
3. 從本地調試應用程序
在調試應用程序以前,確保已經爲項目啓用圖 1 中描述的調試選項。從本地調試應用程序是沒有必要的,可是這能夠確保是否全部調試信息均可用。右鍵單擊 Java 項目,並選擇 Debug As,而後選擇 Java Application(參見圖 3)。若是應用程序在斷點處中止執行,則代表調試信息正確顯示。這時,能夠繼續使用這些調試特性,好比顯示調試堆棧、變量或斷點管理等等。
圖 3. 從本地調試應用程序
4. 導出 Java 項目
咱們將使用這個應用程序做爲調試目標。右鍵單擊 Java 項目,選擇 Export,而後選擇 Java,最後選擇 JAR file 或 Runnable JAR file 導出項目。將在指定的位置生成 JAR 文件。注意,若是 Java 源代碼與目標應用程序不匹配,調試特性將不能正常工做。
5. 手動運行 Java 應用程序
打開控制檯手動啓動應用程序,確保正確配置了 Java 運行時環境。
清單 5. 調用 Java 應用程序的示例
java -jar test.jar
6. 遠程調試應用程序
將 JAR 文件複製到遠程計算機或同一臺計算機上的適當位置,調用調試服務器,而後爲它添加一個客戶機。簡單的 Java 應用程序就能夠充當調試服務器或客戶機。您能夠在 Eclipse 中選擇 Socket Attach 或 Socket Listen 鏈接類型,這取決於特定的配置。接下來的兩個小節將學習如何將應用程序做爲服務器或客戶機運行。
下面這個示例遠程調用 Java 應用程序做爲調試服務器,並在端口 8000 監聽套接字鏈接。目標 VM 將暫停,直到調試器鏈接。
清單 6. Eclipse 鏈接套接字模式下的 VM 調用示例
java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address="8000" -jar test.jar
使用遠程啓動配置啓動 Eclipse,並指定遠程應用程序的目標 VM 地址。爲此,單擊 Run > Debug Configurations,而後在 Eclipse 菜單中雙擊 Remote Java Application。從最新建立的啓動配置中爲目標應用程序指定 IP 和端口。爲了在同一臺機器上運行遠程應用程序,僅需將主機 IP 指定爲 localhost 或 127.0.0.1。
圖 4. 鏈接套接字鏈接的配置
選擇 Allow termination of remote VM 選項終止在應用程序調試期間鏈接的 VM。
圖 5. Eclipse 中的 Terminate 按鈕
第二個示例使用一個簡單的 Java 應用程序做爲調試客戶機,而且調試器前端做爲調試服務器。Eclipse 使用套接字監聽模式鏈接類型進行監聽。必須先啓動調試前端來監聽特定的端口。圖 6 給出一個用於設置監聽的示例配置。
圖 6. 監聽套接字鏈接的配置
單擊 Eclipse Debug 按鈕,狀態欄將顯示消息 「waiting for vm to connect at port 8000...」。看到這個消息後,啓動遠程應用程序。清單 7 顯示瞭如何將 Java 應用程序做爲調試客戶機並調用它,而後使用端口 8000 上的主機 127.0.0.1 的套接字將其鏈接到一個正在運行的調試器應用程序。
清單 7. Eclipse 監聽套接字鏈接模式中的 VM 調用示例
java -Xdebug -Xrunjdwp:transport=dt_socket,address=127.0.0.1:8000,suspend=y -jar test.jar
若是一切進行順利,將會顯示一個調試透視圖幫助調試應用程序,而且遠程 Java 應用程序將正常中止。這相似於步驟 3 中的本地調試(參見圖 3)。在這裏,您可使用標準的調試特性,好比設置斷點和值、單步執行等。