使用 Eclipse 遠端除錯 Java 應用程式(mark)

qq_36821448發表於2018-03-28

遠端除錯對應用程式開發十分有用。例如,為不能託管開發平臺的低端機器開發程式,或在專用的機器上(比如服務不能中斷的 Web  伺服器)除錯程式。其他情況包括:執行在記憶體小或 CUP 效能低的裝置上的 Java  應用程式(比如移動裝置),或者開發人員想要將應用程式和開發環境分開,等等。

先決條件

啟動配置型別
啟動配置儲存一組用於啟動程式的屬性。啟動配置型別是一種可以在 Eclipse 平臺上啟動的獨特程式。

如果您還沒安裝該程式,請下載 Eclipse V3.4(Ganymede)。在 Ganymede  中,套接字(socket)監聽聯結器被新增到 Remote Java Application 啟動配置型別。Eclipse  最新的套接字監聽聯結器允許您開啟 Java 偵錯程式,它能夠監聽特定套接字上的連線。可以從命令列選項開啟被除錯的程式,並將其連線到偵錯程式。在  Ganymede 釋出之前,僅有一個連線套接字的聯結器,被除錯的程式所在的機器必須是一個與偵錯程式相連的除錯主機。由於受到記憶體和 CPU  不足的限制,要想讓移動裝置充當主機是不現實的。

為了進行遠端除錯,必須使用 Java Virtual Machine (JVM) V5.0 或更新版本,比如 IBM® J9 或  Sun Microsystem 的 Java SE Development Kit(JDK)。本文主要討論遠端除錯,而不是每個 Eclipse  除錯特性的細節。檢視 參考資料獲得更多關於使用 Eclipse 進行除錯的資訊,並且可以找到上面提到的軟體。

JPDA 簡介

常用縮寫詞

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 中的遠端除錯特性

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 中的除錯選項 
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 中設定斷點
在 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連線型別,這取決於特定的配置。接下來的兩個小節將學習如何將應用程式作為伺服器或客戶機執行。

作為除錯伺服器的目標 VM

下面這個示例遠端呼叫 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 按鈕
Eclipse 中的 Terminate 按鈕

作為除錯客戶機的目標 VM

第二個示例使用一個簡單的 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)。在這裡,您可以使用標準的除錯特性,比如設定斷點和值、單步執行等。

回頁首

結束語

本文演示如何使用 Eclipse 內建的遠端 Java 應用程式配置型別對應用程式執行遠端除錯。介紹瞭如何設定 Java 應用程式以呼叫遠端除錯,並幫助您理解 Eclipse 提供的聯結器。最後,您還學習瞭如何將這些技術應用到專案中。

原文:http://www.ibm.com/developerworks/cn/opensource/os-eclipse-javadebug/index.html

相關文章