Java远程调试(RemoteDebugging)

star2017 1年前 ⋅ 337 阅读

远程调试生产环境(或远程环境)的 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 端口,就可以打断点调试了。

在源码工程创建一个远程调试的配置,如下:

  1. Run > Edit Configurations > Add New Configurations > Remote
  2. Configuration:输入远程服务的 IP 和 端口
  3. Use module classpath:选择本地源代码的模块
  4. 运行此配置

IDEA 配置远程调试

相关参考

  1. JPDA(jaa platform debugger architecture)
  2. JVM远程DEBUG(JPDA )
  3. JVM远程调试为什么要禁用JIT -Djava.compiler=NONE
  4. JVM启动参数与原理
更多内容请访问:IT源点

相关文章推荐
  • 该目录下还没有内容!

全部评论: 0

    我有话说: