在实际开发中,总会遇到程序启动不起来或者运行结果不符合期望的情况,如果是在本地,直接debug就行了,几乎人人都会,但是如果到了远程,大多数情况下我们可以看日志,通过日志排查定位到问题,但是如果你的日志不多,或者日志中看不出问题,此时情况就比较难以处理了,而实际上我们仍然可以通过debug的形式来解决,只不过由原来的本地在ide中通过GUI来debug变为通过命令行来debug;
开启服务debug端口
如果想要对我们远程部署的服务进行debug,那么首先我们要开启debug端口,开启方式如下:
开启远程debug:
在Java启动命令后追加系统参数
-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=8000
PS:suspend表示是否需要等待远程debug连接再开始启动,y表示需要等待远程debug连接才会继续执行;
开始debug
当我们的服务启动后,我们就可以开始debug了,此时有两种情况:
-
我们本地可以直接连接到服务所在的机器;
-
我们本地无法直接连接到服务所在的机器;(可能是服务在容器中、堡垒机后等)
如果我们本地可以直接连接到服务所在的机器,那么可以在ide中直接选择远程debug,填写好IP和端口号即可连接上进行远程debug,与本地debug的体验基本是一致的,没什么好讲的,我们这里主要说说本地无法连接到服务所在的机器时如何进行debug;
当我们无法连接到远程服务所在的机器时,此时可以使用jdk中为我们提供的jdb来调试,熟悉C语言的可能会想到gdb,这个和C语言的gdb是一个作用,都是用来让我们调试程序的;下面我们来介绍jdb的详细用法:
jdb详细用法
在远程服务的主机上使用jdb命令连接到服务,命令如下(如果jdb所在的机器与服务所在机器不一致,需要将127.0.0.1替换为服务所在机器的IP,但是注意需要保证jdb所在的机器可以通过这个ip+端口直连到服务):
jdb -attach 127.0.0.1:8000
如果有源码,可以使用-sourcepath指定源码,用法与Java指定classpath一致
jdb -sourcepath /源码路径 -attach 127.0.0.1:8000
使用上述命令进入调试控制台后(命令行),我们就可以使用下面这些命令(常用命令)来调试我们的应用了:
stop at: 在指定地方断点