java实现线上环境远程debug调试过程

 更新时间:2025年02月14日 10:20:25   作者:赵广陆  
本文介绍了在Docker容器中配置Tomcat和Spring Boot进行远程调试的方法,通过配置`CATALINA_OPTS`或`JPDA`参数,可以在测试环境中启动Tomcat或Spring Boot应用的debug模式,然后在本地IDEA中设置断点进行调试,从而更高效地定位和解决问题

docker中tomcat实现远程调试配置

由于部署环境的差异性,相信很多朋友都碰到过开发环境正常测试过的功能在测试环境甚至生产环境下出现bug的情况。

一般情况下,生产环境可以采取的手段比较单一,即通过日志的方式获取运行中的环境上下文,分析日志文件并尝试重现bug。

这会带来的问题还是不少的,首先,日志的分析是一项比较耗时的工作;其次,现有的日志记录不一定能反映出问题,你可能需要多次重复这个过程(分析日志->猜测问题->加日志->部署->获取日志)来慢慢逼近问题。

倘若是测试环境,我们还多了一项可供选择的手段——远程调试——将程序在测试环境中以debug模式启动,在本机使用IDEA在工程中设置断点进行调试。

配置docker-compose.yml

  • CATALINA_OPTS参数配置启动远程调试功能
version: '2.2'

services:
  test:
    container_name: test
    image: tomcat:8.5.32

    ports:
      - "5005:5005"

    volumes:
      - "./target/test:/usr/local/tomcat/webapps/ROOT"

    environment:
        # tomcat启动远程调试
        CATALINA_OPTS: "-Xdebug -Xrunjdwp:transport=dt_socket,address=5005,suspend=n,server=y"

    command: ["catalina.sh", "run"]
  • JPDA参数配置启动远程调试功能
version: "3"
services:
  tomcat:
    image: tomcat:8.5.27
    ports:
      - "8080:8080"
      - "5005:5005"
    volumes:
      - ./www:/www:rw
      - ./conf/server.xml:/usr/local/tomcat/conf/server.xml:ro
    environment:
      JPDA_ADDRESS: 5005
      JPDA_TRANSPORT: dt_socket
    command: ["catalina.sh", "jpda", "run"]
    networks:
      - default

  # 需要nginx、mysql、redis、activemq配置都可以在这里加上

networks:
  default:

docker中spring boot实现远程调制配置

首先,我们要让要让远程服务器支持远程调试功能,在项目启动项上追加特定的 JVM 参数即可,参数如下:

晚于 JDK 1.4.X 版本

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

配置docker-compose.yml

app.jar指打包后的spring boot包

version: '2.2'

services:
  test:
    container_name: test

    ports:
      - "8080:8080"
      - "5005:5005"

    CMD ["java","-jar","-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005","-Dspring.profiles.active=sit","app.jar"]

配置IDEA

打开配置窗口

点击左上角+号,找到remote,配置服务部署的服务地址,如果是本地测试配置localhost,配置上文配置中指定的端口

选择启动,即可调试远程项目

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java生成图片验证码实例代码

    java生成图片验证码实例代码

    这篇文章主要介绍了java生成图片验证码实例代码,验证码的种类有很多,问题验证、短信验证还有常见的图片验证,本文就为大家介绍生成图片验证码最简单方法,感兴趣的小伙伴们可以参考一下
    2016-04-04
  • 普通对象使用spring容器中的对象的实现方法

    普通对象使用spring容器中的对象的实现方法

    这篇文章主要介绍了普通对象使用spring容器中的对象的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-06-06
  • Java利用IO流实现简易的记事本功能

    Java利用IO流实现简易的记事本功能

    本文将利用Java中IO流编写一个模拟日记本的程序,通过在控制台输入指令,实现在本地新建文件,打开日记本和修改日记本等功能,感兴趣的可以了解一下
    2022-05-05
  • idea2019版Plugins中搜索不到任何插件的问题解决

    idea2019版Plugins中搜索不到任何插件的问题解决

    本文主要介绍了idea2019版Plugins中搜索不到任何插件的问题解决,插件搜不出来的主要原因是plugins.jetbrains.com ping不通,下面就来介绍一下解决方法,感兴趣的可以了解一下
    2023-09-09
  • Spring轻松解决循环依赖

    Spring轻松解决循环依赖

    Spring的解决循环依赖是有前置条件的,要解决循环依赖我们首先要了解Spring Bean对象的创建过程和依赖注入的方式。依赖注入方式,我之前的博客有所分享,大家可以在看本篇文章之前进行一下小小的回顾
    2023-04-04
  • Maven报错之导入Junit包来实现@Test注解问题

    Maven报错之导入Junit包来实现@Test注解问题

    这篇文章主要介绍了Maven报错之导入Junit包来实现@Test注解问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • SpringBoot中集成企业微信机器人实现运维报警的示例

    SpringBoot中集成企业微信机器人实现运维报警的示例

    本文主要介绍了SpringBoot中集成企业微信机器人实现运维报警,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • Java中的转换流、压缩流、序列化流、打印流及应用场景

    Java中的转换流、压缩流、序列化流、打印流及应用场景

    这篇文章主要介绍了Java中的转换流、压缩流、序列化流、打印流及应用场景,本文结合示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-06-06
  • java 获取当前时间的三种方法

    java 获取当前时间的三种方法

    这篇文章主要介绍了java 获取当前时间的三种方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • Spring Boot 2 整合 QuartJob 实现定时器实时管理功能

    Spring Boot 2 整合 QuartJob 实现定时器实时管理功能

    Quartz是一个完全由java编写的开源作业调度框架,形式简易,功能强大。接下来通过本文给大家分享Spring Boot 2 整合 QuartJob 实现定时器实时管理功能,感兴趣的朋友一起看看吧
    2019-11-11

最新评论