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中NullPointerException异常的原因和解决办法

    详解Java中NullPointerException异常的原因和解决办法

    本文主要介绍了详解Java中NullPointerException异常的原因和解决办法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • Slf4j+logback实现JSON格式日志输出方式

    Slf4j+logback实现JSON格式日志输出方式

    这篇文章主要介绍了Slf4j+logback实现JSON格式日志输出方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • IDEA全局查找关键字的用法解读

    IDEA全局查找关键字的用法解读

    这篇文章主要介绍了IDEA全局查找关键字的用法解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • Spring Boot 整合 Mockito提升Java单元测试的高效实践案例

    Spring Boot 整合 Mockito提升Java单元测试的高效实践案例

    Mockito与Spring Boot的整合为Java开发者提供了一套完整的解决方案,使得单元测试更为精准、高效,从而确保了代码质量、降低了维护成本,并促进了项目的持续集成与交付,感兴趣的朋友跟随小编一起看看吧
    2024-04-04
  • Java8 Stream API中实现集合list转map的多种方式

    Java8 Stream API中实现集合list转map的多种方式

    这篇文章介绍了如何使用Java8的StreamAPI对QuotaDto对象列表进行操作,包括字段提取、映射、组装成Map、枚举类处理、元素拼接、聚合函数以及去重,文章的示例代码讲解详细,感兴趣的小伙伴可以了解下
    2025-12-12
  • Java 控制线程的方法

    Java 控制线程的方法

    这篇文章主要介绍了Java 控制线程的方法,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-06-06
  • Java中八种基本数据类型的默认值

    Java中八种基本数据类型的默认值

    这篇文章主要介绍了Java中八种基本数据类型的默认值 的相关资料,需要的朋友可以参考下
    2016-07-07
  • Mybatis-plus的service通用接口解读

    Mybatis-plus的service通用接口解读

    这篇文章主要介绍了Mybatis-plus的service通用接口解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • SpringIOC BeanDefinition的加载流程详解

    SpringIOC BeanDefinition的加载流程详解

    这篇文章主要为大家介绍了SpringIOC BeanDefinition的加载流程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • Java 序列化和Java反射的底层原理及区别对比分析

    Java 序列化和Java反射的底层原理及区别对比分析

    Java 序列化和反射是 Java 中两个不同维度的机制,序列化聚焦对象的持久化与传输,反射聚焦类 / 对象的动态访问与操作,二者底层原理和应用场景差异显著,以下从底层原理、核心特性、区别对比展开解析,本文介绍Java 序列化和Java反射的底层原理及区别,感兴趣的朋友一起看看吧
    2025-12-12

最新评论