JDB是java调试工具。
查看jdwp的使用说明:java -agentlib:jdwp=help
启动jdb
方式1:本地启动class
jdb MyClass
方式2:调试器 连 vm
先运行被调试程序,suspend=n表示程序不会暂停,如果值为y表示vm启动后先暂停程序,等被attach后再运行:
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 MyClass
然后jdb连接上该vm:
jdb -attach 5005
方式3:vm 连 调试器
jdb启动监听:
jdb -listen localhost:5005
vm主动连接jdb:
java -agentlib:jdwp=transport=dt_socket,server=n,suspend=y,address=5005 Main
调试语法
基础命令
help (或 ?):打印帮助信息
run:设置完断点后,可以开始运行代码
cont:从断点处继续运行
!!:重复执行最后一个命令
<n> <command>:将命令重复执行 n 次
exit (或 quit):退出调试器
打印信息
print:输出表达式的值(如果要打印本地变量,需要这样javac -g编译)
print MyClass.myStaticField
print myObj.myInstanceField
print i + j + k
print myObj.myMethod() (if myMethod returns a non-null)
print new java.lang.String("Hello").length()
dump:输出对象信息
main[1] dump p
p = {
a: 0
b: 0
}
where:打印当前线程调用栈
main[1] where
[1] Main.m2 (Main.java:30)
[2] Main.m1 (Main.java:26)
[3] Main.main (Main.java:20)
断点
设置断点:
stop at MyClass:22(在指定行断点)
stop in java.lang.String.length(在方法入口断点)
stop in MyClass.<clinit>(在类的静态初始化处断点)
stop in MyClass.myMethod(int,java.lang.String)(如果是重载方法,要指定参数类型)
stop in MyClass.myMethod()(如果是重载方法,必须带括号)
清除断点:
clear MyClass:45
查看断点:
stop 或 clear 都行
单步执行
step:执行当前行
step up:一直执行, 直到当前方法返回到其调用方
stepi:执行当前指令
next:执行当前行(跳过调用)
异常
出现指定的异常错误时中断,jdb会暂停但最终异常还是会抛出去:
catch java.io.FileNotFoundException
取消catch:
ignore java.io.FileNotFoundException
查看:
catch 或 ignore 都行
查看class信息
classes:列出当前已知的类
class:显示已命名类的详细资料
main[1] class java.lang.String
类: java.lang.String
扩展: java.lang.Object
实现: java.io.Serializable
实现: java.lang.Comparable
实现: java.lang.CharSequence
嵌套: java.lang.String$CaseInsensitiveComparator
methods:列出类的方法
main[1] methods Main
** 方法列表 **
Main <init>()
Main main(java.lang.String[])
Main m1()
Main m2()
Main m2(int)
java.lang.Object <init>()
java.lang.Object registerNatives()
java.lang.Object getClass()
java.lang.Object hashCode()
java.lang.Object equals(java.lang.Object)
java.lang.Object clone()
java.lang.Object toString()
java.lang.Object notify()
java.lang.Object notifyAll()
java.lang.Object wait(long)
java.lang.Object wait(long, int)
java.lang.Object wait()
java.lang.Object finalize()
java.lang.Object <clinit>()
fields:列出类的字段
main[1] fields java.lang.String
** 字段列表 **
char[] value
int hash
long serialVersionUID
java.io.ObjectStreamField[] serialPersistentFields
java.util.Comparator CASE_INSENSITIVE_ORDER
线程
threads:列出所有线程
> threads
组system:
(java.lang.ref.Reference$ReferenceHandler)0x162 Reference Handler正在执行条件等待
(java.lang.ref.Finalizer$FinalizerThread)0x161 Finalizer 正在执行条件等待
(java.lang.Thread)0x160 Signal Dispatcher正在运行
组main:
(java.lang.Thread)0x1 main 正在执行条件等待
(java.lang.Thread)0x26e thread-1 正在休眠
thread 0x26e:切换到指定线程
lock (expr):输出对象的锁信息
main[1] lock p
监视p ("Point@52d455b8") 的信息:
拥有者: main, 条目计数: 2
正在等待线程: thread-1
threadlocks [thread id]:输出线程的锁信息
main[1] threadlocks 1
监视线程main的信息:
拥有的监视器: instance of Point(id=449)
未等待监视器
main[1] threadlocks 0x26f
监视线程thread-1的信息:
不拥有监视器
正在等待监视器: instance of Point(id=449)
其他
use (或 sourcepath) [source file path]:显示或更改源路径
classpath:从目标 VM 输出类路径信息