1. 程式人生 > >Eclipse 進行遠端除錯Windows Tomcat配置

Eclipse 進行遠端除錯Windows Tomcat配置

以前看到別人使用除錯遠端程式碼感覺好牛逼的樣子,前一段時間想學來著,但是由於實際工作中暫時沒有用上最終沒學會,好悲傷!今天終於需要用了,Google+Baidu了一堆,終於將Windows Tomcat遠端除錯給學會了,不吹牛逼了,進入正題。

1. 配置windows tomcat伺服器端: 

rem*******設定Tomcat目錄*******--
set CATALINE_HOME=E:\V6.0\ApacheJetspeed
E:
rem 8787為可用埠,為遠端除錯監聽埠--
cd %CATALINE_HOME%/bin
set JPDA_ADDRESS=8787 
set JPDA_TRANSPORT=dt_socket 
set CATALINA_OPTS=-server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8787 
startup
這段程式碼的意思是配置Tomcat執行環境來啟用伺服器端遠端除錯功能,這裡就必須提到JPDA了(其實我也不太懂,就把其他大牛的博文貼下來了)

******************************************************華麗的分割線******************************************************

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

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
******************************************************華麗的分割線******************************************************

2. 配置Eclipse遠端除錯:

2.1 Debug ->Debug Configurations;

2.2 硬菜來了:


2.3 Debug 

3. 總結:

   如果不想了解太多的話,我建議

3.1. 只需要將第一步的指令碼複製下來儲存到一個.bat檔案中;

3.2 按照如圖在Eclipse中配置

4. 注意:

4.1 指令碼中的E:是為了切換到CATALINE_HOME目錄中(可不要犯低階錯誤哦);

4.2 演示的【埠:8787】記住為空閒埠,可以任意修改;

4.3 可以使用命令:netstat -ano | findstr 8787檢測JPDA監聽埠是否正常開啟;

4.4 連線遠端主機時若無法連線遠端連線,很有可能是伺服器防火牆遮蔽了,window7環境配置埠過濾如下圖: