文章目录

说明

【1】对于远程Debug一般的jar运行或者容器环境运行其实操作方式都是一样的,只要提供远程监听的协议端口,保持网络连通就可以了。
【2】我使用的远程Debug工具IntelliJ IDEA,我在使用该工具连接一个JDK11的项目时一直抛出Connection refused,但是经过多次验证网络和端口是连通的,当我再次阅读这篇Debug your Java applications in Docker using IntelliJ IDEA教程的时候,发现下面提示到只支持到JDK8及以下版本。
在这里插入图片描述
这篇文章是2019年发布的,我并没有花时间去翻阅文档看目前是否支持JDK9以上版本,但是当我切换到目标项目的版本为jdk8后,正常连接了。
【3】检查客户端和远程服务debug连通的判断依据是:
服务器端启动输出:Listening for transport dt_socket at address:
客户端启动输出:
Connected to the target VM, address: ‘ip:port’, transport: ‘socket’

【4】为什么需要使用到远程Debug呢?就拿我个人使用来说,我是因为遇到一个无法在本地复现的问题,而且这个问题就只出现的容器运行时,这个问题我不清楚我在构建基础镜像的时候有哪些错误,我想要通过Debug进入到更底层的代码看具体有哪些问题,虽然最终我依然没有排查到问题所在,但是我觉得这个是一个可以参考的解决问题的方式。但是注意你不可以在生产环境使用哦,在容器化和K8S编排的情况下,我比较推荐的是你直接将该镜像拉取运行在到一个测试Linux服务器上调试问题。
【5】这个方式仅仅是一个可选的解决方案而已,如果你想看真正运行或者线上服务的问题,你可以使用arthas这类工具。

使用流程

刚开始的搭建起来感觉比较麻烦,但是在操作完一次后,整个流程搞起来10分钟左右就可以了,还是比较方便的。

【1】项目是使用k8s部署的,因为是容器环境复现问题可以在任何一个Docker环境中,注意版本。拉取对应项目的镜像。

【2】将Dockerfile关联的启动脚本拷贝到测试服务器,并添加如下启动参数

-Xdebug -Xrunjdwp:transport=dt_socket,address=9992,server=y,suspend=n

这里指定了启动的服务会开启器一个debug监听端口,启动的端口是9992,默认是5005,这里我修改了为9992
在这里插入图片描述
【3】docker启动,绑定映射启动脚本和端口开放,一个应用端口一个debug监听端口。

docker run -p 8888:8888   -p 9992:9992  -v /root/start.sh  镜像名称

在这里插入图片描述
【4】上面的提示说明服务器端已经启动成功了,现在配置客户端
在这里插入图片描述
编辑配置
在这里插入图片描述

-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=9992

客户端的配置IDEA会自动帮我们生成
在这里插入图片描述
启动项目,如上所示已经启动成功了
在这里插入图片描述
如上所示,我们去请求远程服务器应用并在本地对应代码位置打上端点即可,注意保持代码一致。

关于Debug原理的知识整理,可以见我之前分享的文章:Java平台调试体系原理和实践整理 远程Debug

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐