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 继续执行,只到下一个断点

4 未完待续。。。

Author: root

Created: 2017-11-15 三 15:34

Validate