一、什么是远程调试
有时候代码部署到测试环境之后发现问题,但是在本地又不能重现,通常是数据不一致或者其他问题,本地无法定位,这时候就需要远程调试了。
二、远程调试的原理和核心
由于是对源码进行调试,源码经编译后运行在远程服务器上,并且在本地Idea IDE中打开源码。
本地虚拟机与远程虚拟机相互通信,远程虚拟机监控自身的栈帧,方法调用等运行信息,本地虚拟机通过Java API提供的可使用的调试接口,向远程虚拟机发送调试命令,并接受显示调试结果。
远程调试的核心:JPDA(Java Platform Debugger Architecture)框架。
三、远程调试的必备条件
本地的代码必须和远程服务器上的字节码是同一个版本,保持一致,否则IDEA无法启动。
通过前端请求进行远程调试,后端打断点失效常见原因
- 本地与远程代码不一致
- 远程IP,端口配置错误
- 本地源码与二进制代码不一致:实际JVM是基于二进制代码运行的,需要重新编译。
四、远程调试的步骤
4.1 本机IDEA配置
编辑配置--加号---远程JVM调试,输入远程主机,监听端口,选择jdk,使用的模块类路径。
命令行参数介绍:
- -Xdebug 启用调试。
- -Xrunjdwp :启用JDWP实现,
以下是子选项
- transport=dt_socket : JPDA front-end和back-end之间的传输方法。dt_socket表示使用套接字传输。
- address=8180:远程JVM在8180端口上监听请求。
- server=y :y表示启动的JVM是被调试者。如果为n,则表示启动的JVM是本机。
- suspend=n : n表示调试时会暂停远程虚拟机。
4.2远程服务器配置
4.2.1 tomcat项目启动
Linxu系统: tomcat/bin/startup.sh开始处中增加如下内容:
```Plain Text declare -x CATALINA_OPTS="-server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8180"
8180为监听端口,要和本地IDEA的监听端口保持一致。

重启服务器即可。
#### 4.2.2 springboot项目启动
springboot项目使用如下命令启动即可。
```java
java -Xdebug -Xrunjdwp:transport=dt_socket,address=8081,server=y,suspend=y -jar jar包名称
4.3 启动调试
远程服务器启动之后,即可启动本地的IDEA。
正常启动后,对线上环境进行操作,断点即可定位到我们本地的IDEA,可以像本地一样进行调试。
五、注意事项
5.1 远程调试的日志是在本地还是在远程服务器?
日志不会打印在IDEA的控制台上。
System.out 以及 log.info 还是打印在远程的。
5.2 调试时其他人会不会卡住?
使用远程调试时候,打了断点,别的人在测试这个页面的时候是会卡住的。
5.3 本地代码修复bug远程调用时候有效么
无效,运行的还是远程部署的jar中的代码
5.4 为什么网上有各种各样的启动参数
因为java1.4,java5-8,java9的是不一样的!在idea中可以选择版本自动切换。