本文已参与「新人创作礼」活动,一起开启掘金创作之路。
背景
在本地开发的时候一般遇到问题都是通过debug去排查调试,如果在测试环境有问题需要调试,那么就可以采用JDB的方式,其实idea等开发工具debug的原理也是这个。前提是要指定debug端口。
所有的操作都要先打断点
1、线上程序使用jdb
jdb -connect sun.jvm.hotspot.jdi.SAPIDAttachingConnector:pid=
例如:
jdb -connect sun.jvm.hotspot.jdi.SAPIDAttachingConnector:pid=6620
1.1 线上运行jar
启动
nohup java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=9966 -jar InterfaceParallel.jar > /dev/null &
使用jdb连接
jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=9966
1.2 debug 后台进程
- 1、 修改启动脚本,添加jvm参数(9966为监控端口)
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=9966
- 2、使用jdb监听指定端口
jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=9966
- 3、设置断点
然后一直运行,进程会自动停在断点处
可以查看变量了
1.3 debug web界面
- 1、修改jvm参数,增加参数
-Xdebug
-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=9977
2、普通程序使用jdb
例如:
javac -g CZ.java
jdb CZ
3、常用命令
1、设置断点
1.1 stop in 类.方法名
例如:(在main方法设置断点)
stop in CZ.main
1.2 sotp at 类:行号
例如:
sotp at CZ:5
2、cont 向下运行直到断点
例如:
cont
3、locals 查看输出当前堆栈帧中的所有局部变量
locals
4、methods 获取当前类的所有方法
methods 类名
例如:
methods CZ
5、step 执行当前行
step
print 变量名
例如:
6、使用list查看源代码运行的位置
list
7、step up 执行当前方法
8、clear 列出断点
9、dump 查看实体内容
dump object
之后遇到继续更新。