Java Remote Debug

References

Debug Cases

Local Debug

Basic debug of a simple class file

run java class like

1
jdb HelloWorld

Then set breakpoint and do debug like Remote debug steps below.
U can try it with the doc jdb simple use in reference.

Remote debug

add the params below as java run params, such as

1
2
bash
java -Xdebug -Xrunjdwp:transport=dt_socket,address=9999,server=y,suspend=y HelloWorld

run jdb with

1
2
bash
jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=9999

then the jdb should set the breakpoint with command stop

1
2
3
4
5
6
7
8
bash
设置未捕获的java.lang.Throwable
设置延迟的未捕获的java.lang.Throwable
正在初始化jdb...
>
VM 已启动: 当前调用堆栈上没有帧
main[1]

input stop command to setup breakpoint

1
2
bash
main[1] stop in HelloWolrd.main

it will show

1
2
3
4
bash
正在延迟断点HelloWolrd.main。
将在加载类后设置。
main[1]

then input cont/step/next/step up or some other debug command to debug the code.

The jdb manual quick search

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
bash
** 命令列表 **
connectors -- 列出此 VM 中可用的连接器和传输
run [class [args]] -- 开始执行应用程序的主类
threads [threadgroup] -- 列出线程
thread <thread id> -- 设置默认线程
suspend [thread id(s)] -- 挂起线程 (默认值: all)
resume [thread id(s)] -- 恢复线程 (默认值: all)
where [<thread id> | all] -- 转储线程的堆栈
wherei [<thread id> | all]-- 转储线程的堆栈, 以及 pc 信息
up [n frames] -- 上移线程的堆栈
down [n frames] -- 下移线程的堆栈
kill <thread id> <expr> -- 终止具有给定的异常错误对象的线程
interrupt <thread id> -- 中断线程
print <expr> -- 输出表达式的值
dump <expr> -- 输出所有对象信息
eval <expr> -- 对表达式求值 (与 print 相同)
set <lvalue> = <expr> -- 向字段/变量/数组元素分配新值
locals -- 输出当前堆栈帧中的所有本地变量
classes -- 列出当前已知的类
class <class id> -- 显示已命名类的详细资料
methods <class id> -- 列出类的方法
fields <class id> -- 列出类的字段
threadgroups -- 列出线程组
threadgroup <name> -- 设置当前线程组
stop in <class id>.<method>[(argument_type,...)]
-- 在方法中设置断点
stop at <class id>:<line> -- 在行中设置断点
clear <class id>.<method>[(argument_type,...)]
-- 清除方法中的断点
clear <class id>:<line> -- 清除行中的断点
clear -- 列出断点
catch [uncaught|caught|all] <class id>|<class pattern>
-- 出现指定的异常错误时中断
ignore [uncaught|caught|all] <class id>|<class pattern>
-- 对于指定的异常错误, 取消 'catch'
watch [access|all] <class id>.<field name>
-- 监视对字段的访问/修改
unwatch [access|all] <class id>.<field name>
-- 停止监视对字段的访问/修改
trace [go] methods [thread]
-- 跟踪方法进入和退出。
-- 除非指定 'go', 否则挂起所有线程
trace [go] method exit | exits [thread]
-- 跟踪当前方法的退出, 或者所有方法的退出
-- 除非指定 'go', 否则挂起所有线程
untrace [methods] -- 停止跟踪方法进入和/或退出
step -- 执行当前行
step up -- 一直执行, 直到当前方法返回到其调用方
stepi -- 执行当前指令
下一步 -- 步进一行 (步过调用)
cont -- 从断点处继续执行
list [line number|method] -- 输出源代码
use (或 sourcepath) [source file path]
-- 显示或更改源路径
exclude [<class pattern>, ... | "none"]
-- 对于指定的类, 不报告步骤或方法事件
classpath -- 从目标 VM 输出类路径信息
monitor <command> -- 每次程序停止时执行命令
monitor -- 列出监视器
unmonitor <monitor#> -- 删除监视器
read <filename> -- 读取并执行命令文件
lock <expr> -- 输出对象的锁信息
threadlocks [thread id] -- 输出线程的锁信息
pop -- 通过当前帧出栈, 且包含当前帧
reenter -- 与 pop 相同, 但重新进入当前帧
redefine <class id> <class file name>
-- 重新定义类的代码
disablegc <expr> -- 禁止对象的垃圾收集
enablegc <expr> -- 允许对象的垃圾收集
!! -- 重复执行最后一个命令
<n> <command> -- 将命令重复执行 n 次
# <command> -- 放弃 (无操作)
help (或 ?) -- 列出命令
version -- 输出版本信息
exit (或 quit) -- 退出调试器
<class id>: 带有程序包限定符的完整类名
<class pattern>: 带有前导或尾随通配符 ('*') 的类名
<thread id>: 'threads' 命令中报告的线程编号
<expr>: Java(TM) 编程语言表达式。
支持大多数常见语法。