使用 Eclipse 遠端除錯 Java 應用程式
遠端除錯對應用程式開發十分有用。例如,為不能託管開發平臺的低端機器開發程式,或在專用的機器上(比如服務不能中斷的 Web 伺服器)除錯程式。其他情況包括:執行在記憶體小或 CUP 效能低的裝置上的 Java 應用程式(比如移動裝置),或者開發人員想要將應用程式和開發環境分開,等等。
先決條件
如果您還沒安裝該程式,請下載 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 簡介
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 提供的聯結器。最後,您還學習瞭如何將這些技術應用到專案中。
原文:http://www.ibm.com/developerworks/cn/opensource/os-eclipse-javadebug/
相關文章
- 使用 Eclipse 遠端除錯 Java 應用程式(mark)Eclipse除錯Java
- 用WinDBG遠端除錯程式除錯
- IDEA、ECLIPSE遠端除錯IdeaEclipse除錯
- 使用Eclipse除錯PHP應用Eclipse除錯PHP
- 淺談1——用Eclipse除錯JAVA程式Eclipse除錯Java
- 使用Eclipse除錯Java程式的10個技巧Eclipse除錯Java
- 使用Eclipse除錯Java 程式的10個技巧Eclipse除錯Java
- java Remote Debug(遠端除錯)JavaREM除錯
- 使用Intellij IDEA遠端除錯Spark程式IntelliJIdea除錯Spark
- Idea進行java應用的遠端除錯Remote debuggingIdeaJava除錯REM
- 遠端除錯在Linux車機中的應用除錯Linux
- Pycharm遠端除錯PyCharm除錯
- 前端遠端除錯前端除錯
- chrome 遠端除錯Chrome除錯
- 使用IDEA遠端debug除錯Idea除錯
- 使用Xdebug進行遠端除錯除錯
- 使用IDEA進行遠端除錯Idea除錯
- 原來 Java 遠端除錯如此簡單Java除錯
- PHPSTROM遠端除錯PHP除錯
- pycharm 遠端除錯配置PyCharm除錯
- Spark 1.5.0 遠端除錯Spark除錯
- Mobile Web 除錯指南(2):遠端除錯Web除錯
- phpstorm 遠端除錯 homstead 程式碼PHPORM除錯
- 智慧小程式檔案館——遠端除錯除錯
- 在海思晶片上使用GDB遠端除錯晶片除錯
- Flutter 應用程式除錯Flutter除錯
- 用 IBM Lotus Expeditor 進行遠端除錯IBM除錯
- [原] 在 PhpStorm 中使用 Xdebug 遠端除錯 PHP 程式(框架/原生均適用)PHPORM除錯框架
- 如何遠端除錯部署在CloudFoundry平臺上的nodejs應用除錯CloudNodeJS
- vsc 如何除錯遠端python程式碼除錯Python
- Dapr 遠端除錯之 Nocalhost除錯
- pycharm 遠端除錯之二PyCharm除錯
- 遠端除錯 Azure Web App除錯WebAPP
- 使用Eclipse進行PHP的伺服器端除錯EclipsePHP伺服器除錯
- [android]使用jdb除錯android應用程式Android除錯
- gdb除錯命令小結_與多檔案除錯_遠端除錯除錯
- 使用Clion優雅的完全遠端自動同步和遠端除錯c++除錯C++
- 智慧小程式檔案館——再談遠端除錯除錯