程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 使用Eclipse遠程調試Java應用程序

使用Eclipse遠程調試Java應用程序

編輯:關於JAVA

遠程調試對應用程序開發十分有用。例如,為不能托管開發平台的低端機器開發程序,或 在專用的機器上(比如服務不能中斷的 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 中的調試選項

遠程調試應用程序

現在,我們已經准備好遠程調試應用程序。我們分步執行:

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 連接類型,這取決於特定的配置。接下來的兩個小節將學習如何將應用程序作為服務器或客 戶機運行。

作為調試服務器的目標 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 按鈕

作為調試客戶機的目標 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 提供的連接器 。最後,您還學習了如何將這些技術應用到項目中。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved