IDEA线上排错神器之JVM远程Debug

你是否为线上排查问题而苦恼,今天教你不发版的情况下进行线上 Debug。

搭建环境

首先我们新建一个最简单的 Spring Boot 项目,输出 12345 是为了方便我们调试

通过 Maven 进行打包,并上传至远程服务器,我这里使用的虚拟机

使用以下命令运行 jar

1
2
# JDK5-8
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar remote-jvm-debug-0.0.1-SNAPSHOT.jar

以上参数可以在 IDEA 中找到,根据自己 JDK 的版本 copy 参数,本例使用的是 JDK8

参数说明:

  • transport: 监听 Socket 端口连接方式(也可以 dt_shmem 共享内存方式,但限于 Windows 机器,并且服务提供端和调试端只能位于同一台机)

  • server: =y 表示当前是调试服务端,=n 表示当前是调试客户端

  • suspend: =n 表示启动时不中断(如果启动时中断,一般用于调试启动不了的问题)

  • address: =5005 表示本地监听 5005 端口

注意

  1. 因为这里使用到5005,所以远程服务器如果开启防火墙需要放行5005端口

    Linux 查看防火墙状态: systemctl status firewalld

    Linux 暂时关闭防火墙: systemctl stop firewalld

  2. -agentlib:xxxx必须在 -jar 之前

jar 运行之后的效果如下

远程调试

远程启动好 jar 后,在 idea 中配置远程 Debug,如图所示:

最后我们运行 Remote JVM Debug,并在程序中打一个断点

我们使用 Postman 请求接口后,此时就可以调试线上的程序了,需要注意的是,本地程序不需要运行,但是必须保证本地的代码和远程服务器上的代码是一致。