jdb(Java Debugger)是 JDK 內建的命令列除錯工具,支援本地與遠端 JVM 除錯。雖然現代 IDE 提供圖形化除錯介面,但掌握 jdb 能在無圖形介面的伺服器環境中快速定位問題,是 Java 開發者的必備技能。
jdb MyClass
JVM 會啟動並載入 MyClass,在執行第一條指令前暫停,等待除錯指令。
先以除錯模式啟動應用程式:
java -agentlib:jdwp=transport=dt_shmem,address=jdbconn,server=y,suspend=n MyClass
再使用 jdb 連接:
jdb -attach jdbconn
此模式適合生產環境或容器化部署的遠端除錯。
| 指令 | 說明 |
|---|---|
help / ? | 顯示所有可用指令 |
run [class [args]] | 執行主類別的 main 方法 |
threads | 列出所有執行緒 |
thread <thread id> | 切換預設執行緒 |
where | 印出當前執行緒堆疊追蹤 |
print <expr> | 評估並印出運算式值(支援欄位、區域變數、方法呼叫) |
dump <expr> | 印出物件所有欄位值 |
locals | 印出當前堆疊框架的所有區域變數(需編譯時加 -g) |
classes | 列出已載入的類別 |
class <class id> | 顯示類別詳細資訊 |
methods <class id> | 列出類別方法 |
fields <class id> | 列出類別欄位 |
stop in <class>.<method>[(args)] | 在方法進入點設中斷點 |
stop at <class>:<line> | 在指定行號設中斷點 |
clear <class>.<method> / clear <class>:<line> | 清除中斷點 |
step | 單步執行(進入方法) |
next | 單步執行(不進入方法) |
cont | 從中斷點繼續執行 |
exit | 結束除錯會話 |
-sourcepath <dir1:dir2...>:指定原始碼搜尋路徑(預設為當前目錄)-connect <connector>:<name>=<value>,...:以連接器參數連接目標 JVM-tclient / -tserver:指定 Client/Server VM 模式-J<option>:傳遞參數給執行 jdb 的 JVM(如 -J-Xms48m 設定堆大小)// HelloWorld.java
public class HelloWorld {
public static void main(String[] args) {
String msg = "Hello, jdb!";
System.out.println(msg);
}
}
javac -g HelloWorld.javajdb HelloWorldstop at HelloWorld:4runprint msgcont更多進階用法請參考官方文件:jdb - Java Debugger