赞
踩
在编写代码时, 总会遇到这样或者那样的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
## 如果脚本是以nohup 命令启动的, 则需要添加如下参数
## -Xdebug Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=10010
nohup java -jar -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=10010 your_application.jar &
重新启动项目
本地代码要和远程的代码保持一致, 否则有可能会导致调试失败
在远程项目启动成功后, 在本地运行第一步的远程配置
本质和上面步骤差不多, 但是需要在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 配置
关于远程调试原理和配置参数解释. 如果还想了解更多请见 这里
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。