• 远程Debug运行在容器内的Java项目实践整理


    文章目录

    说明

    【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
    
    • 1

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

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

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

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

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

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

  • 相关阅读:
    线段树的区间修改
    HTML5的基础知识的梳理及常用标签
    测试面试 | 某互联网大厂测试面试真题,你能回答出多少?
    云服务器配置怎么选?云服务器配置考虑哪些因素?
    深度思考计算机网络面经之三
    猫狗图像数据集上的深度学习模型性能对比
    探索 SOCKS5 代理在跨境电商中的网络安全应用
    资深设计师们都在用的20个3dsMax建模技巧
    Stream流中的Map与flatMap的区别
    k8s-权限管理
  • 原文地址:https://blog.csdn.net/Octopus21/article/details/126191058