idea 远程调试
背景
在编写代码时, 总会遇到这样或者那样的bug. 这有些bug 特别是业务逻辑的bug .
在生产或测试环境好复现而在开发环境不好复现. 现在提供的一种思路, 就是远程调试:
我们可以在本地直接调试生产环境或者测试环境的代码. 只需我们本地代码和远程部署的代码一致.
远程主机就会通过socket 将程序执行情况同步到本地
操作
下面以idea 为例
-
设置远程启动配置
在我们平时启动项目的坐边, 有一个 edit configuration的选项, 然后点击 + , 选择 Remote JVM Debug 选项
Name 为之后启动的名称,
Host 是远程服务器的 ip,
port: 用于远程socket 连接的端口, 注意不要和项目端口一致, 否则可能会导致项目启动失败
然后idea 会为我们自动生成一条命令行参数:
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=10010
-
远程项目启动参数
如果是使用的 java -jar xxx.jar 启动, 只需要在原来的启动方式加入第1步生成的参数即可. 例如## 注意socket端口(address) 需要根据第一步自己设置的端口来配置 java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=10010 -jar xxx.jar
-
重新启动项目
本地代码要和远程的代码保持一致, 否则有可能会导致调试失败
在远程项目启动成功后, 在本地运行第一步的远程配置
注意事项
- 如果服务器配置了 iptables/防火墙 , 需要放开对应的端口
- 如果使用的是云服务器, 则也需要放开对应socket端口的安全组
- 如果使用开发工具的是eclipse , 远程调试见这位大佬的博客 传送门
- 如果使用docker 部署的jar, 则需要进行如下配置
docker 项目进行远程调试
本质和上面步骤差不多, 但是需要在docker 中, 添加一个内部端口和外部端口的映射
以便我们本地能够通过这个映射访问docker 项目部署的容器
步骤:
-
修改 DockerFile 文件
在DockerFile 中的项目启动参数的位置添加idea 生成的参数
(也可以复制下面参数, 只需修改为自己设置的socket 连接端口)
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=10010
部分DockerFile文件展示
FROM java:8 COPY xxx.jar xxx.jar EXPOSE 8081 ENTRYPOINT ["java","-Duser.timezone=GMT+8","-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=10010","-jar","/xxx.jar"]
-
配置Docker 镜像启动参数
利用 -p hostPort:containerPort 参数将 docker 容器内部 10010 端口映射到项目部署服务器的 10010 端口;
xxx 为项目名docker run -d --restart=always --name xxx -p 8081:8081 -p 10010:10010 \ -v /home:/home \ -v /home/szhyyt-logs/xxx/:/logs \ -v /home/xxx/upload:/upload \ xxx:0.0.1 --spring.profiles.active=prod
-
启动docker 镜像, 本地运行 Remote Jvm Debug 配置
关于远程调试原理和配置参数解释. 如果还想了解更多请见 这里