首先我们说一下调试的本质,了解了调试的本质我们就很容易理解远程调试是怎么来的了。
-
Java本地debug时我们常常以为breakpointer打在了java文件中,看到到了breakpointer处jvm停了下来,认为debug时jvm运行的就是java文件了。其实并不是这样。jvm只能运行经过编译后的class文件,那么breakpointer打在了java文件中虚拟机怎么知道什么时候暂停呢,答案当然是通信了,本地运行的服务和IDE进行通信确定断点的位置和单签运行stack中的value。
-
Java远程调试的原理是两个VM之间通过debug协议进行通信,然后以达到远程调试的目的,两者之间可以通过socket进行通信
说完了本质,接下来的工作就容易了。远程调试是jvm附带的功能,jvm的功能当然是用启动参数来开关了。
首先我们在远程服务器jvm启动参数里添加如下命令
-Xdebug -Xrunjdwp:transport=dt_socket,suspend=n,server=y,address={port}
其中port是对外暴露的debug端口。
- 如果是docker容器的话还要在docker.yml文件中这么配置

配置好参数和映射端口。有安全策略的需要打开对对应端口(我这里是5555端口)的策略。
这样服务器端就配置完成了,这时候把服务启动起来。
然后配置客户端
- 首先要保证本地代码和远端完全一致,这样socket通信才能正确匹配到breakpointer。 然后打开Edit Configurations,

- 点击+号,选择”Remote”,其中Name填写名称,这里为bosstest_hw,host为远程代码运行的机器的ip地址(配置好域名的也可用域名),port为上一步指定的debug_port,我这里是5555。然点击Apply,OK。这里的参数idea会自动生成。

- 配置好后就可以到这里选择配置好的这一项

- 之后点击debug

- 启动成功就是这样了

之后尽情的打断点debug吧。需要注意的是cpu性能不足或者网速过慢这里的debug速度会很受影响,另外切记不能修改代码。因为执行的不是本地代码。👌
附:
开启远程visualVM JMX连接参数
JAVA_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=172.16.1.53 -Dcom.sun.management.jmxremote.rmi.port=9999"
本文介绍了Java远程调试的原理,强调了调试本质是通过通信协议实现的。详细讲解了如何在远程服务器及Docker容器中配置JVM启动参数以启用调试,并指导如何在IDEA中设置远程调试客户端,确保服务启动后可以正常进行远程调试。注意调试速度可能受CPU性能和网络状况影响,且无法实时修改代码。
1万+

被折叠的 条评论
为什么被折叠?



