java的IDE眾多,包括Eclipse,Idea等,這些工具都提供了完善的斷點(diǎn)調(diào)試功能;
jdb跟上面列舉的IDE里包含的調(diào)試器底下依賴(lài)著同一套調(diào)試API,也就是Java Platform Debugger Architecture (JPDA)。功能也類(lèi)似,只是界面是命令行的,表明上看起來(lái)不太一樣而已;
調(diào)試方式
jdb有多種調(diào)試方式:
交互式調(diào)試
- 本地:
jdb -XX:-UseCompressedOops -XX:+UseSerialGC --啟動(dòng)jdb,可帶參數(shù)
run com.test.Main
或
jdb com.test.Main
- 遠(yuǎn)程
jdb -listen 6000
java -Xdebug -Xrunjdwp:transport=dt_socket,server=n,address=<ip>:6000 <class>
JDWP
java應(yīng)用啟動(dòng)時(shí),增加啟動(dòng)參數(shù)(linux和windows配置方式不一樣,具體見(jiàn)附錄的jdwp官方說(shuō)明文檔):
#linux環(huán)境
-agentlib:jdwp=transport=dt_socket,address=36888,server=y,suspend=n
jdb -attach <ip>:36888#連接到JVM
Connector
通過(guò)** jdb -listconnectors** 命令可以查看本機(jī)JDK支持的連接器;
注意:通過(guò)Connector不需要做任何額外配置,但調(diào)速器不能對(duì)進(jìn)程做任何修改,也就是說(shuō)類(lèi)似進(jìn)入只讀模式;
- 調(diào)試本地進(jìn)程
jdb -connect sun.jvm.hotspot.jdi.SAPIDAttachingConnector:pid=44159
```
- 調(diào)試遠(yuǎn)程進(jìn)程
- 啟動(dòng)SA Debug Server
jsadebugd <pid> [server-id]
如果啟動(dòng)多個(gè)debug server,可以配置server-id;
- 連接到遠(yuǎn)程SA Debug Server
jdb -connect sun.jvm.hotspot.jdi.SADebugServerAttachingConnector:debugServerName=machine1
注:machine1為機(jī)器名或IP
- 調(diào)試本機(jī)CoreDump
jdb -connect sun.jvm.hotspot.jdi.SACoreAttachingConnector:core= <core file>,javaExecutable=$JAVA_HOME/bin/java
- 調(diào)試遠(yuǎn)程CoreDump
- 啟動(dòng)SA Debug Server
jsadebugd $JAVA_HOME/bin/java core.20441
- 連接到遠(yuǎn)程SA Debug Server
jdb -connect sun.jvm.hotspot.jdi.SADebugServerAttachingConnector:debugServerName=machine1
注:machine1為機(jī)器名或IP
常用命令
jdb支持的命令可以通過(guò)help查看,常見(jiàn)的命令包括:
-
添加斷點(diǎn)
stop at com.test.MyClass:22 stop in java.lang.String.length stop in com.test.MyClass.<init>#構(gòu)造函數(shù) stop in com.test.MyClass.<clinit>#靜態(tài)代碼塊
-
查看線(xiàn)程
threads #查看所有線(xiàn)程 thread <id> #查看單個(gè)線(xiàn)程 where #查看線(xiàn)程堆棧 pop #當(dāng)前幀出棧, 且打印當(dāng)前幀
-
單步調(diào)試
step #執(zhí)行當(dāng)前行 step up #一直執(zhí)行, 直到當(dāng)前方法返回到其調(diào)用方 stepi #執(zhí)行當(dāng)前指令 next #步進(jìn)一行 (調(diào)用) cont #從斷點(diǎn)處繼續(xù)執(zhí)行
-
查看變量
print <expr> #輸出表達(dá)式的值 dump <expr> #輸出所有對(duì)象信息 eval <expr> #對(duì)表達(dá)式求值 (與 print 相同) set <lvalue> = <expr> #向字段/變量/數(shù)組元素分配新值 locals #輸出當(dāng)前堆棧幀中的所有本地變量
-
其他
list [line number|method] -- 輸出源代碼 use (或 sourcepath) [source file path] #顯示或更改源路徑(目錄)