文章目录
背景介绍
开发过程中,我们经常会遇到部署的代码运行出问题、看日志由不是很直观、我们希望可以像调试本地代码一样去调试远程代码;IDEA提供了Remote工具,基于JVM的跨平台能力,我们可以远程调试部署的代码。
IDEA的Debug的优缺点
优点: 把断点打在本地,直接访问线上程序即可,方便调试。(线上程序出了问题,无法根据log进行排查时)。
缺点: 可能会造成"阻塞"。(同一程序中,本地断点没走完之前,别的接口请求可能会"阻塞")。
使用原理
使用 IntelliJ IDEA 进行远程调试的实际原理是通过 Java 远程调试协议(JDWP)来实现的。以下是远程调试的基本原理:
打开远程调试功能:在远程服务器的 Java 应用程序中,需要在启动参数中添加特定的选项来启用远程调试功能。通常是通过设置 -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=: 来启用远程调试。
配置 IDEA 远程调试:在 IntelliJ IDEA 中,你需要创建一个远程调试配置,在该配置中指定要连接的远程服务器的地址和端口号等信息。
建立调试连接:当你在 IDEA 中启动远程调试配置时,IDEA 将尝试连接到远程服务器上指定的地址和端口号,然后与运行在远程服务器上的 Java 应用程序建立调试连接。
交互式调试:一旦连接建立成功,你就可以像在本地调试一样在 IDEA 中进行远程调试了。你可以设置断点、观察变量、单步执行等操作,同时在远程服务器上的应用程序也会相应地暂停和执行。
总的来说,使用 IDEA 进行远程调试的原理就是在远程服务器上启用远程调试功能,并通过 IDEA 建立调试连接,然后在本地进行交互式的调试操作。这样可以在不影响远程服务器上的运行情况的情况下,对远程服务器上的 Java 应用程序进行调试和故障排除。
客户端(idea 、eclipse 等)之所以可以进行调试,是由于客户端 和 服务端(程序端)进行了 socket 通信,通信过程如下:
1、先建立起了 socket 连接
2、将断点位置创建了断点事件通过 JDI 接口传给了 服务端(程序端)的 VM,VM 调用 suspend 将 VM 挂起 3、VM 挂起之后将客户端需要获取的 VM 信息返回给客户端,返回之后 VM resume 恢复其运行状态
4、客户端获取到 VM 返回的信息之后可以通过不同的方式展示给客户
前提
保证远程和本地跑的代码是一致的
保证远程和本地跑的代码是一致的
使用操作
脚本
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address={自己定义的端口号}
或者
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address={自己定义的端口号}
样例
原始脚本
java -Dloader.path=./lib/ -Dspring.config.location=./config/ -Dspring.profiles.active=dev -jar ./web-0.0.1.jar
结果
java -Xdebug -Xrunjdwp:transport=dt_socket,suspend=n,server=y,address=0.0.0.0:5006 -Dloader.path=./lib/ -Dspring.config.location=./config/ -Dspring.profiles.active=dev -jar ./web-0.0.1.jar