线上出了问题,但是本地不能重现,可以通过IDEA远程Debug功能远程调试排查问题。具体操作如下:
一、本地IDEA配置
单击项目顶部“Edit Configurations”
新增运行配置:"Remote JVM Debug"
之后进入远程Debug配置页面:
页面上有些配置,配置详情如下所示:
1、Debugger mode
有两种模式:
Attach to remote JVM:最常使用的模式,本地连接远程JVM,需要确保远程端口号(默认5005,可自定义)开放能够被本地连接
Listen to remote JVM:不常使用的模式,远端连接本地JVM,需要确保本地端口号(默认5005,可自定义)开放能够被远端连接
2、Transport
调试和被调试的JVM的通信方式。
Socket:套接字连接的方式,通过TCP方式通信,适用于调试的JVM和被调试的JVM在不同机器上的情况。
Shared memory:共享内存方式,适用于调试的JVM和被调试的JVM在相同的机器上的情况,传输速度比Socket快。
3、JDK选择
根据运行的JVM情况,选择对应的JDK版本,不同的JDK版本对应不同的运行命令
将命令行参数复制到被调试JVM的启动命令行中。
4、use module classpath选择
如果是maven组织的多模块项目,选择根模块即可。
二、远程JVM配置
根据上一步复制的命令行参数,比如Java8,需要将命令行参数
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
复制到启动命令行,比如完整的jar包启动命令:
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar app.jar
三、调试
先启动远程jar包,jar包启动命令行第一行输出会提示"Listening for transport dt_socket at address: 5005",这表示自己已经准备好客户端远程调试了。
之后点击IDEA的调试启动按钮
如果连接成功,则会在输出控制台输出类似如下内容:
Connected to the target VM, address: '10.182.50.44:31819', transport: 'socket'
之后正常打断点,远程JVM运行到断点处代码,本地IDEA会自动跳转到对应的断点处代码。
END。
注意:本文归作者所有,未经作者允许,不得转载