jdb debug java howto
java的IDE很发达,很少有直接使用jdb的情况,并且jdb着实很不好用。但是呢?对不用IDE的小伙伴,掌握jdb还是必须的。
1 启用java的远程调试
启动java时,需要增加参数 -Xdebug -agentlib:jdwp=transport=dt_socket,address=localhost:9999,server=y,suspend=n
,开启远程调试,这里需要谨慎选择address,以免调试端口暴露在公网上,安全起见,可以选择localhost。
对于开发时,用maven启动的程序,可以通过设置 MAVEN_OPTS
环境变量的方式设置java启动参数。
2 连接调试端口
jdb -attach localhost:9999
3 常用的命令
3.1 help
不言而喻
3.2 查看类,成员函数,成员变量
用来方便设置断点
3.2.1 查看所有的类
classes
可以查看已经加载的所有类
3.2.2 查看类信息
class <class id>
查看类信息,包括父类,嵌套类
类: qiyun.model.Workflow 扩展: java.lang.Object 嵌套: qiyun.model.Workflow$NextCond 嵌套: qiyun.model.Workflow$OrgDuty 嵌套: qiyun.model.Workflow$SelectNext 嵌套: qiyun.model.Workflow$StartNode 嵌套: qiyun.model.Workflow$WorkNode 嵌套: qiyun.model.Workflow$Worksheet
3.2.3 查看类的成员函数
methods <class id>
查看类的成员函数,包括继承的
qiyun.model.Workflow getWorkNode(long) qiyun.model.Workflow getNextsDetail(java.util.List) qiyun.model.Workflow getNexts(long) java.lang.Object <init>() java.lang.Object registerNatives() java.lang.Object getClass() java.lang.Object hashCode()
3.2.4 查看类的成员变量
fields <class id>
查看类的成员变量
3.3 断点相关
下面的<class id> 必须是完全限定名,不能只是类名,对于嵌套类,用$分隔
3.3.1 在方法中设置断点
stop in <class id>.<method> 例如 stop in example.WorkflowManager.worksheetNext
3.3.2 在行中设置断点
stop at <class id>:<line> 例如 stop at example.WorkflowManager:216
需要注意,空行也可以成功设置断点,但是会报错,例如:无法设置断点example.WorkflowManager:215: example.WorkflowManager中的行 215 处没有代码。
3.3.3 可能错误的断点设置
stop in WorkflowManager.worksheetNext
输出
正在延迟断点WorkflowManager.worksheetNext。 将在加载类后设置
这里显示成功设置了断点,但是这个设置的是 WorkflowManager
的,不是 example.WorkflowManager
的,显然后者才是我们的目的。
3.3.4 查看并删除断点
clear
查看所有断点clear <class id>:<line>
清除行中断点clear <class id>.<method>
清除方法中的断点
这个是stop的逆过程,比较好理解。
3.4 查看堆栈信息
where
3.5 查看变量的值
- locals 查看当前的所有本地变量
- print 查看表达式的值
- dump 查看对象的详细信息,例如各个字段的信息
请看下面的对比
qtp910889057-13[1] print approver approver = "example.Approver@7ad4e984" qtp910889057-13[1] dump approver approver = { id: 11 worksheetTitle: "星期三测试" employeeId: 31415946 opinion: 3 updatedAt: instance of java.time.LocalDateTime(id=8669) } qtp910889057-13[1] print employeeId employeeId = 31415946
3.6 执行
step up
一直执行到方法返回step
单步执行cont
继续执行,只到下一个断点