远程调试生产环境(或远程环境)的 Java 应用,以便快速定位某些在本地环境难以重现的问题。
远程部署的可能是个 Jar 包 或 Tomcat、Jetty 应用,若定位生产问题是通过反复修改 log 发包,效率就太低下了。
Java 提供了 JPDA 远程调试将本地源码与部署服务器连接,可以在本地控制断点的运行。
JPDA(Java Platform Debugger Architecture)为Java平台上的调试器定义了一个标准的体系结构。
该体系结构包括3个主要组成部分:JVM TI、JDI和JDWP。
开启Debug模式
远程Java应用以 Debug 模式启动,Java 命令时必须带上以下 JVM 参数。
java -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
# 或
java -Xdebug -Xrunjdwp:transport=dt_socket, address=8000,server=y,suspend=y
参数说明:
JVM 的 -X
参数是非标准选项,在不同的版本的 JVM 中,参数可能不同,可通过 java -X
查看参数。
-Xdebug
:开启 Debug 模式。-Xnoagent
:关闭 Agent 代理。-Djava.compiler=NONE
:禁止 JIT 对整个 class 进行编译,只使用转译器,提高效率。-Xrunjdwp
:启用JDWP实现,它包含若干子选项。transport=dt_socket
:JPDA front-end 和 back-end之间的传输方法。dt_socket
表示使用套接字传输。server=y
:y 表示启动的 JVM 是被调试者;n,则表示启动的 JVM 是调试器。suspend=y
:y 表示启动的 JVM 会暂停等待,直到调试器连接上。address=5005
:JVM在指定端口上监听请求。
调试 Spring Boot
在运行的 Spring Boot Jar 的命令上加上远程调试的 JVM 启动参数。
java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 -jar -Xms128m -Xmx128m demo.jar &
调试 Tomcat
修改文件%TOMCAT_HOME%\bin\catalina.sh
,添加运程调试的 JVM 启动参数,文件第一行添加下面代码。
JAVA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005"
JAVA_OPTS:定义的一个Java 命令参数选项,catalina 脚本会拼接所有 JAVA_OPTS
命令。如下:
set "JAVA_OPTS=%JAVA_OPTS% %JSSE_OPTS%"
IDEA连接远程Debug端口
远程服务以 Debug 模式启动成功后,本地 IDEA 就可以连接上远程服务对应的 Debug 端口,就可以打断点调试了。
在源码工程创建一个远程调试的配置,如下:
- Run > Edit Configurations > Add New Configurations > Remote
- Configuration:输入远程服务的 IP 和 端口
- Use module classpath:选择本地源代码的模块
- 运行此配置
相关参考
注意:本文归作者所有,未经作者允许,不得转载