最近使用WTP的Server功能很不爽,連tomcat服務器時java類中的任何改動都要重啓服務器,一怒之下就改用JPDA了,如下是一些總結。 前端
什麼是JPDA
Java Platform. Debugger Architecture(JPDA:Java平臺調試架構) 由Java虛擬機後端和調試平臺前端組成
1.Java虛擬機提供了Java調試的功能
2.調試平臺經過調試交互協議向Java虛擬機請求服務以對在虛擬機中運行的程序進行調試 java
JPDA的構架
JPDA經過兩個接口和協議來完成如上的說明,分別是JVMTI(Java虛擬機工具接口)、JDWP(Java調試連線協議)和JDI(Java調試接口)。
1.JVMTI定義了虛擬機應該提供的調試服務,包括調試信息(Information譬如棧信息)、調試行爲(Action譬如客戶端設置一個斷點)和通知(Notification譬如到達某個斷點時通知客戶端),該接口由虛擬機實現者提供實現,並結合在虛擬機中
2.JDWP定義調試服務和調試器之間的通訊,包括定義調試信息格式和調試請求機制
3.JDI在語言的高層次上定義了調試者能夠使用的調試接口以能方便地與遠程的調試服務進行交互,Java語言實現,調試器實現者可直接使用該接口訪問虛擬機調試服務。 後端
運行方式
當虛擬機的調試服務運行時,虛擬機做爲調試的服務提供端,監聽一個鏈接,而調試器經過該鏈接與虛擬機進行交互。目前,Windows平臺的JVM提供了兩種方式的鏈接:共享內存和 Socket鏈接,共享內存的服務提供端和調試端只能位於同一臺機,而Socket鏈接則支持不一樣異機調試,即遠程調試。 tomcat
虛擬機參數設置
1.啓用調試服務
-Xdebug 啓用調試
-Xrunjdwp: 加載JVM的JPDA參考實現庫
2.Xrunjdwp子參數(sub-options)配置
Xrunjdwp子參數的配置格式以下
-Xrunjdwp:[=],[=]... 服務器
幾個例子
-Xrunjdwp:transport=dt_socket,server=y,address=8000
在8000端口監聽Socket鏈接,掛起VM而且不加載運行主函數直到調試請求到達
-Xrunjdwp:transport=dt_shmem,server=y,suspend=n
選擇一個可用的共享內存(由於沒有指address)並監聽該內存鏈接,同時加載運行主函數
-Xrunjdwp:transport=dt_socket,address=myhost:8000
鏈接到myhost:8000提供的調試服務(server=n,以調試客戶端存在),掛起VM而且不加載運行主函數
-Xrunjdwp:transport=dt_shmem,address=mysharedmemory
經過共享內存的方式鏈接到調試服務,掛起VM而且不加載運行主函數
-Xrunjdwp:transport=dt_socket,server=y,address=8000,
onthrow=java.io.IOException,launch=/usr/local/bin/debugstub
等待java.io.IOException被拋出,而後掛起VM並監聽8000端口鏈接,在接到調試請求後以命令/usr/local/bin/debugstub dt_socket myhost:8000執行
-Xrunjdwp:transport=dt_shmem,server=y,onuncaught=y,launch=d:\bin\debugstub.exe
等待一個RuntimeException被拋出,而後掛起VM並監聽一個可用的共享內存,在接到調試請求後以命令d:\bin\debugstub.exe dt_shmem 架構
啓動tomcat
-Xdebug -Xrunjdwp:transport=%JPDA_TRANSPORT%,address=%JPDA_ADDRESS%,server=y,suspend=n socket
以上兩行是tomcat5.5.12的catalina.bat文件中的一句,能夠看出tomcat在JPDA方式下是怎麼啓動的,啓動tomcat要用catalina jpda start來啓動,不能用startup.bat啓動,啓動前設置好JPDA_TRANSPORT,JPDA_ADDRESS就OK了 函數