jdb
server:
- JDK 9 or later:-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005
- JDK 5 - 8:-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
- JDK 1.4.x:-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
- JDK 1.3.x or earlier:-Xnoagent -Djava.compiler=NONE -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
client:
jdb <options> <class> <arguments>
[options]
-help -- 列印輔助資訊并退出
-sourcepath <directories separated by ";">
-- 要在其中查找源檔案的目錄
-attach <address> -- 使用标準連接配接器附加到指定位址處正在運作的VM
-listen <address> -- 等待正在運作的VM使用标準連接配接器在指定位址處連接配接
-listenany -- 等待正在運作的VM使用标準連接配接器在任何可用位址處連接配接
-launch -- 立即啟動VM而不是等待'run'指令
-listconnectors -- 列出此VM中的可用連接配接器
-connect <connector-name>:<name1>=<value1>,...
-- 使用所列參數值通過指定的連接配接器連接配接到目标VM
-dbgtrace [flags] -- 輸出資訊供調試jdb
-tclient -- 在HotSpot(TM)客戶機編譯器中運作應用程式
-tserver -- 在HotSpot(TM)伺服器編譯器中運作應用程式
轉發到被調試程序的選項:
-v -verbose[:class|gc|jni]
-- 啟用詳細模式
-D<name>=<value> -- 設定系統屬性
-classpath <directories separated by ";">
-- 列出要在其中查找類的目錄
-X<option> -- 非标準目标VM選項
-------------------
connectors -- 列出此VM中可用的連接配接器和傳輸
run [class [args]] -- 開始執行應用程式的主類
threads [threadgroup] -- 列出線程
thread <thread id> -- 設定預設線程
suspend [thread id(s)] -- 挂起線程(預設值:all)
resume [thread id(s)] -- 恢複線程(預設值:all)
where [<thread id> | all]
-- dump線程的堆棧
wherei [<thread id> | all]
-- dump線程的堆棧,以及pc資訊
up [n frames] -- 上移線程的堆棧
down [n frames] -- 下移線程的堆棧
kill <thread id> <expr> -- 終止具有給定的異常錯誤對象的線程
interrupt <thread id> -- 中斷線程
print <expr> -- 輸出表達式的值
dump <expr> -- 輸出所有對象資訊
eval <expr> -- 對表達式求值(與print相同)
set <lvalue> = <expr> -- 想字段/變量/數組元素配置設定新值
locals -- 輸出目前堆棧幀中的所有本地變量
classes -- 列出目前已知的類
class <class id> -- 顯示已命名類的詳細資料
methods <class id> -- 列出類的方法
fields <class id> -- 列出類的字段
threadgroups -- 列出線程組
threadgroup <name> -- 設定目前線程組
stop in <class id>.<method>[(argument type,...)]
-- 在方法中設定斷點
stop in <class id>:<line>
-- 在行中設定斷點
clear <class id>.<method>[(argument type,...)]
-- 清除方法中的斷點
clear <class id>:<line> -- 清除行中的斷點
clear -- 列出斷點
catch [uncaught|caught|all] <class id>|<class pattern>
-- 出現指定的異常錯誤時中斷
ignore [uncaught|caught|all] <class id>|<class pattern>
-- 對于指定的異常錯誤,取消'catch'
watch [access|all] <class id>.<field name>
-- 監視對字段的通路/修改
unwatch [access|all] <class id>.<field name>
-- 停止監視對字段的通路/修改
trace [go] methods [thread]
-- 跟蹤方法進入和退出,除非指定'go',否則挂起所有線程
untrace [methods] -- 停止跟蹤方法進入和/或退出
step -- 執行目前行
step up -- 一直執行,知道目前方法傳回到其調用方
stepi -- 執行目前指令,下一步,步進一行(步過調用)
cont -- 從斷點出繼續執行
list [line number|method]
-- 輸出源代碼
use (或 sourcepath) [source file path]
-- 顯示或更改源路徑
exclude [<class pattern>, ... | "none"]
-- 對于指定的類,不報告步驟或方法時間
classpath -- 從目标VM輸出類路徑資訊
monitor <command> -- 每次程式停止時執行指令
monitor -- 列出螢幕
unmonitor <monitor#> -- 删除螢幕
read <filename> --讀取并執行指令檔案
lock <expr> -- 輸出對象的鎖資訊
threadlocks [thread id] -- 輸出線程的鎖資訊
pop -- 通過目前幀出棧,且包含目前幀
reenter -- 與pop相同,但重新進入目前幀
redefine <class id> <class file name>
-- 重新定義類的代碼
disablegc <expr> -- 禁止對象的垃圾收集
enablegc <expr> -- 允許對象的垃圾收集
!! -- 重複執行最後一個指令
<n> <command> -- 将指令重複執行n次
# <command> -- 放棄(無操作)
help (或 ?) -- 列出指令
version -- 輸出版本資訊
exit (或quit) -- 退出調試器
<class id>:帶有程式包限定符的完整類名
<class pattern>:帶有前導或尾随通配符('*')的類名
<thread id>:'threads'指令中報告的線程編号
<expr>:Java(TM)程式設計語言表達式。支援大多數常見文法。
可以将啟動指令置于"jdb.ini"或".jdbrc"中
位于user.home或user.dir中
jdb -attach 5005
https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr011.html
https://docs.oracle.com/javase/7/docs/technotes/tools/windows/jdb.html
https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jdb.html