基于遠程怎么調(diào)試JAVA呢?
JAVA的長途調(diào)試 基于Java Platform Debugger Architecture(JPDA:Java平臺調(diào)試架構(gòu))。 JVM 自身支撐指定參數(shù)來讓java順序以調(diào)試形式啟動。虛擬機運轉(zhuǎn)在調(diào)試形式下,你只需去銜接他的響應(yīng)的監(jiān)聽端口就可以了。
像tomcat等效勞器也都供應(yīng)了指定調(diào)試參數(shù)的設(shè)置辦法
典型的調(diào)試參數(shù)如下
-Xdebug -Xrunjdwp:transport=dt_socket,address=8888,server=y,suspend=n
典型的銜接 調(diào)試端口的敕令如下,以jdk自帶的敕令行調(diào)試 東西jdb為例。
銜接 192.29.24.62 的8888 端口
/build/java/jdk1.6.0_03/bin/jdb -attach 192.29.24.62:8888
下面這句和上面采用attach參數(shù)的上面一句一樣的結(jié)果。但是采用 -connect的指定了具體了,有時從windows的機械上去銜接上面
Linux的機械,上面阿誰不可,但是這句就可以。
/build/java/jdk1.6.0_03/bin/jdb -connect com.sun.jdi.SocketAttach:port=8888,hostname=192.29.24.62
在 Eclipse 中也有長途調(diào)試 選項的了,“run” -》 “Open Debug Dialog” -》“Remote Java Application” 阿誰就是。
在選項里面選定詳細(xì)的“項目” “代碼目次”等,填好ip、端口,最終點下面的“ 調(diào)試 ”按鈕就行了,啟動后下斷點,等等都和本機調(diào)試無異。留意的是本機的代碼和在長途機上運轉(zhuǎn)的代碼應(yīng)該是一致的。
<img style=\"WIDTH: 580px; HEIGHT: 464px\" class=\"blogimg\" border=\"0\" src=\"http://hiphotos.baidu.com/widebright/pic/item/e122e9c4eb5214a68226ac06.jpg\" width=\"580\" height=\"464\" small=\"0\" />
----------------jdb 用法----------------
C:\\Program Files\\Java\\jdk1.6.0_03\\bin>jdb -help
用法:jdb <選項> <類> <參數(shù)>
個中選項包羅:
-help 輸出此音訊并退出
-sourcepath <以 \";\" 分隔的目次>
在個中查找源文件的目次
-attach <地址>
運用規(guī)范銜接器銜接到正在指定地址運轉(zhuǎn)的 VM
-listen <地址>
等候正在指定地址運轉(zhuǎn)的 VM 運用規(guī)范銜接器進行銜接
-listenany
等候正在恣意可用地址運轉(zhuǎn)的 VM 運用規(guī)范銜接器進行銜接
-launch
立刻啟動 VM,而不等候 \'run\' 敕令
-listconnectors 列出此 VM 中可用的銜接器
-connect <銜接器稱號>:<稱號 1>=<值 1>,...
運用定名的銜接器和列出的參數(shù)值銜接到目的 VM
-dbgtrace [標(biāo)記] 輸出用于調(diào)試 jdb 的信息
-tclient 在 Hotspot(TM) Performance Engine(客戶機)中運轉(zhuǎn)使用順序
-tserver 在 Hotspot(TM) Performance Engine(效勞器)中運轉(zhuǎn)使用順序
轉(zhuǎn)發(fā)給被調(diào)試歷程的選項:
-v -verbose[:class|gc|jni]
啟用具體形式
-D<稱號>=<值> 設(shè)置系統(tǒng)屬性
-classpath <以 \";\" 分隔的目次>
列出要在個中查找類的目次
-X<選項> 非規(guī)范目的 VM 選項
<類> 是要開端調(diào)試的類的稱號
<參數(shù)> 是傳遞給 <類> 的 main() 辦法的參數(shù)
要取得敕令協(xié)助,請在 jdb 提醒符下鍵入 \'help\'
C:\\Program Files\\Java\\jdk1.6.0_03\\bin>jdb
正在初始化 jdb...
> help
** 敕令列表 **
connectors -- 列出此 VM 中可用的銜接
run [類 [參數(shù)]] -- 開端執(zhí)行使用順序的主類
threads [線程組] -- 列出線程
thread <線程 ID> -- 設(shè)置默許線程
suspend [線程 ID] -- 暫停線程(默許值為 all)
resume [線程 ID] -- 恢復(fù)線程(默許值為 all)
where [<線程 ID> | all] -- 轉(zhuǎn)儲線程的倉庫
wherei [<線程 ID> | all] -- 轉(zhuǎn)儲線程的倉庫以及 pc
up [n 幀] -- 向上挪動線程的倉庫
down [n 幀] -- 向下挪動線程的倉庫
kill <線程 ID> <表達式> -- 中止具有給定的異常對象
interrupt <線程 ID> -- 中綴線程
print <表達式> -- 輸出表達式的值
dump <表達式> -- 輸出一切對象信息
eval <表達式> -- 核算表達式的值(與
set = <表達式> -- 為字段/變量/數(shù)組元素
locals -- 輸出當(dāng)時倉庫幀中的一切
classes -- 列出當(dāng)時已知的類
class <類 ID> -- 顯示已定名類的具體信息
methods <類 ID> -- 列出類的辦法
fields <類 ID> -- 列出類的字段
threadgroups -- 列出線程組
threadgroup <稱號> -- 設(shè)置當(dāng)時線程組
stop in <類 ID>.<辦法>[(參數(shù)類型,...)]
-- 在辦法中設(shè)置斷點
stop at <類 ID>:<行> -- 在行中設(shè)置斷點
clear <類 ID>.<辦法>[(參數(shù)類型,...)]
-- 肅清辦法中的斷點
clear <類 ID>:<行> -- 肅清行中的斷點
clear -- 列出斷點
catch [uncaught|caught|all] <類 ID>|<類形式>
-- 呈現(xiàn)指定的異常時中綴
ignore [uncaught|caught|all] <類 ID>|<類形式>
-- 關(guān)于指定的異常,作廢
watch [access|all] <類 ID>.<字段名>
-- 看管對字段的拜訪/修正
unwatch [access|all] <類 ID>.<字段名>
-- 中止看管對字段的拜訪/
trace [go] methods [thread]
-- 跟蹤辦法的進入和退出。
-- 除非指定 \'go\',不然所
trace [go] method exit | exits [thread]
-- 跟蹤當(dāng)時辦法的退出或所
-- 除非指定 \'go\',不然所
untrace [辦法] -- 中止跟蹤辦法的進入和/或退
step -- 執(zhí)行當(dāng)時行
step up -- 執(zhí)行到當(dāng)時辦法返回其調(diào)
stepi -- 執(zhí)行當(dāng)時指令
next -- 跳過一行(跨過挪用)
cont -- 從斷點處持續(xù)執(zhí)行
list [line number|method] -- 輸出源代碼
use(或 sourcepath)[源文件途徑]
-- 顯示或更改源途徑
exclude [<類形式>, ...|“無”]
-- 不申報指定類的步調(diào)或方
classpath -- 從目的 VM 輸出類途徑信
monitor <敕令> -- 每次順序中止時執(zhí)行敕令
monitor -- 列出看管器
unmonitor <看管器號> -- 刪除某個看管器
read <文件名> -- 讀取并執(zhí)行某個敕令文件
lock <表達式> -- 輸出對象的鎖信息
threadlocks [線程 ID] -- 輸出線程的鎖信息
pop -- 彈出整個倉庫,且包括當(dāng)
reenter -- 與 pop 效果一樣,但重
redefine <類 ID> <類文件名>
-- 從新界說類代碼
disablegc <表達式> -- 制止對象的渣滓收受接管
enablegc <表達式> -- 答應(yīng)對象的渣滓收受接管
!! -- 反復(fù)執(zhí)行最終一個敕令
<敕令> -- 將敕令反復(fù)執(zhí)行 n 次
# <敕令> -- 拋棄(不執(zhí)行)
help(或 ?) -- 列出敕令
version -- 輸出書本信息
exit(或 quit) -- 退出調(diào)試器
<類 ID>: 帶有軟件包限制符的完好類名
<類形式>: 帶有前導(dǎo)或后綴通配符 (*) 的類名
<線程 ID>: \'threads\' 敕令中所申報的線程號
<表達式>: Java(TM) 編程言語表達式。
支撐大大都經(jīng)常見語法。
可以將啟動敕令置于 \"jdb.ini\" 或 \".jdbrc\" 之中
(兩者位于 user.home 或 user.dir 中)
>
==========參考文檔=======================================
什么是JPDA
Java Platform Debugger Architecture(JPDA:Java平臺調(diào)試架構(gòu)) 由Java虛擬機后端和調(diào)試平臺前端構(gòu)成
1.Java虛擬機供應(yīng)了Java調(diào)試的功用
2.調(diào)試平臺經(jīng)過調(diào)試交互和談向Java虛擬機懇求效勞以對在虛擬機中運轉(zhuǎn)的順序進行調(diào)試
JPDA的構(gòu)架
JPDA經(jīng)過兩個接口和和談來完成如上的闡明,辨別是JVMTI(Java虛擬機東西接口)、JDWP(Java調(diào)試連線和談)和JDI(Java調(diào)試接口)。
1.JVMTI界說了虛擬機應(yīng)該供應(yīng)的調(diào)試效勞,包羅調(diào)試信息(Information譬如棧信息)、調(diào)試行為(Action譬如客戶端設(shè)置一個斷點)和告訴(Notification譬如抵達某個斷點時告訴客戶端),該接口由虛擬機完成者供應(yīng)完成,并連系在虛擬機中
2.JDWP界說調(diào)試效勞和調(diào)試器之間的通訊,包羅界說調(diào)試信息花樣和調(diào)試懇求機制
3.JDI在言語的高條理上界說了調(diào)試者可以運用的調(diào)試接口以能便利地與長途的調(diào)試效勞進行交互,Java言語完成,調(diào)試器完成者可直接運用該接口拜訪虛擬機調(diào)試效勞。
運轉(zhuǎn)方法
當(dāng)虛擬機的調(diào)試效勞運轉(zhuǎn)時,虛擬機作為調(diào)試的效勞供應(yīng)端,監(jiān)聽一個銜接,而調(diào)試器經(jīng)過該銜接與虛擬機進行交互。當(dāng)前,Windows平臺的JVM供應(yīng)了兩種方法的銜接:共享內(nèi)存和 Socket銜接,共享內(nèi)存的效勞供應(yīng)端和調(diào)試端只能位于統(tǒng)一臺機,而Socket銜接則支撐分歧異機調(diào)試,即長途調(diào)試。
虛擬機參數(shù)設(shè)置
1.啟用調(diào)試效勞
-Xdebug 啟用調(diào)試
-Xrunjdwp:<sub-options> 加載JVM的JPDA參考完成庫
2.Xrunjdwp子參數(shù)(sub-options)裝備
Xrunjdwp子參數(shù)的裝備花樣如下
-Xrunjdwp:[=],[=]...
幾個例子
-Xrunjdwp:transport=dt_socket,server=y,address=8000
在8000端口監(jiān)聽Socket銜接,掛起VM而且不加載運轉(zhuǎn)主函數(shù)直到調(diào)試懇求抵達
-Xrunjdwp:transport=dt_shmem,server=y,suspend=n
選擇一個可用的共享內(nèi)存(由于沒有指address)并監(jiān)聽該內(nèi)存銜接,還加載運轉(zhuǎn)主函數(shù)
-Xrunjdwp:transport=dt_socket,address=myhost:8000
銜接到myhost:8000供應(yīng)的調(diào)試效勞(server=n,以調(diào)試客戶端存在),掛起VM而且不加載運轉(zhuǎn)主函數(shù)
-Xrunjdwp:transport=dt_shmem,address=mysharedmemory
經(jīng)過共享內(nèi)存的方法銜接到調(diào)試效勞,掛起VM而且不加載運轉(zhuǎn)主函數(shù)
-Xrunjdwp:transport=dt_socket,server=y,address=8000,
onthrow=java.io.IOException,launch=/usr/local/bin/debugstub
等候java.io.IOException被拋出,然后掛起VM并監(jiān)聽8000端口銜接,在接到調(diào)試懇求后以敕令/usr/local/bin/debugstub dt_socket myhost:8000執(zhí)行
-Xrunjdwp:transport=dt_shmem,server=y,onuncaught=y,launch=d:\\bin\\debugstub.exe
等候一個RuntimeException被拋出,然后掛起VM并監(jiān)聽一個可用的共享內(nèi)存,在接到調(diào)試懇求后以敕令d:\\bin\\debugstub.exe dt_shmem
執(zhí)行,
是可用的共享內(nèi)存
啟動tomcat
-Xdebug -Xrunjdwp:transport=%JPDA_TRANSPORT%,address=%JPDA_ADDRESS%,server=y,suspend=n
以上兩行是tomcat5.5.12的catalina.bat文件中的一句,可以看出tomcat在JPDA方法下是怎樣啟動的,啟動tomcat要用catalina jpda start來啟動,不克不及用startup.bat啟動,啟動前設(shè)置好JPDA_TRANSPORT,JPDA_ADDRESS就OK了
-------------------------------------
Java長途調(diào)試
其實就是運用了JDK的JPDA,在啟動效勞器(Jboss或許Tomcat等)的敕令行參數(shù)里面加上:
-Xdebug -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n
以Eclipse作為調(diào)試東西的話,創(chuàng)立一個Remote Java Application,銜接參數(shù)填寫準(zhǔn)確的IP和端口(就是上面的8787)就行了
起首,JAVA本身支撐調(diào)試功用,并供應(yīng)了一個簡略的調(diào)試東西--JDB,相似于功用強壯的GDB,JDB也是一個字符界面的調(diào)試情況,并支撐設(shè)置斷點,支撐線程線級的調(diào)試。
------------------------------------------------
JAVA的調(diào)試辦法如下:
1。起首支撐JVM,并設(shè)置參數(shù),使之任務(wù)在DEBUG形式下,參加參數(shù):-Xdebug -Xrunjdwp,transport=dt_socket,server=y,address=5432,suspend=n,onthrow=java.io.IOException,launch=/sbin/echo
個中,-Xdebug是告訴JVM任務(wù)在DEBUG形式下,-Xrunjdwp是告訴JVM運用(java debug wire protocol)來運轉(zhuǎn)調(diào)試情況。該參數(shù)還了一系列的調(diào)試選項:
transport指定了調(diào)試數(shù)據(jù)的傳送方法,dt_socket是指用SOCKET形式,尚有dt_shmem指用共享內(nèi)存方法,個中,dt_shmem只合用于Windows平臺。
server參數(shù)是指能否支撐在server形式的VM中.
onthrow指明,當(dāng)發(fā)生該類型的Exception時,JVM就會中綴下來,進行調(diào)式。該參數(shù)可選。
launch指明,當(dāng)JVM被中綴下來時,執(zhí)行的可執(zhí)行順序。該參數(shù)可選
suspend指明,能否在調(diào)試客戶端樹立起來后,再執(zhí)行JVM。
onuncaught(=y或n)指明呈現(xiàn)uncaught exception 后,能否中綴JVM的執(zhí)行.
2。啟動調(diào)試東西。
最簡略的調(diào)試東西就是上面提到的JDB,以上述調(diào)試用JVM為例,可以用下面的命運轉(zhuǎn)啟動JDB:
jdb -connect com.sun.jdi.SocketAttach:port=5432,hostname=192.168.11.213
別的,還有很多的可視化調(diào)試東西,如 eclipse,jsawt等等。Eclipses可用 ant debug來樹立一個調(diào)試辦法。