当前位置: 代码网 > it编程>编程语言>Java > Java后端本地调试实用方法总结大全

Java后端本地调试实用方法总结大全

2026年01月14日 Java 我要评论
一、ide 调试基础技巧1.idea 断点调试(必备)核心功能:行断点:单击 gutter 设置断点条件断点:右键断点设置条件表达式(如 userid != null && useri

一、ide 调试基础技巧

1.idea 断点调试(必备)

核心功能

  • 行断点:单击 gutter 设置断点
  • 条件断点:右键断点设置条件表达式(如 userid != null && userid > 100
  • 日志断点:不暂停程序,仅打印日志(右键 suspend 取消勾选)
  • 异常断点:debug 窗口 → view breakpoints → + java exception breakpoints

实用技巧

  • alt + f8:evaluate expression 动态执行代码
  • ctrl + f8:快速切换行断点
  • ctrl + shift + f8:管理所有断点
  • drop frame:回退到方法调用前(堆栈帧),重新执行

二、日志与监控

2.slf4j + logback 动态日志级别

场景:生产环境无法重启,需动态调整日志排查问题。

配置

# application.yml
logging:
  level:
    root: info
    com.example.service: debug
    com.example.mapper: trace

动态修改(无需重启):

// 通过 actuator 端点
@restcontroller
public class logcontroller {
    @autowired
    private loggingsystem loggingsystem;
    
    @postmapping("/log/level")
    public void setloglevel(@requestparam string logger, @requestparam string level) {
        loggingsystem.setloglevel(logger, loglevel.valueof(level));
    }
}

访问:post /actuator/loggers/com.example.service + body {"configuredlevel": "debug"}

3.spring boot actuator 监控

关键端点

management:
  endpoints:
    web:
      exposure:
        include: health,info,beans,conditions,env,metrics,mappings,loggers

常用调试场景

  • /actuator/beans:查看 bean 是否加载
  • /actuator/conditions:查看自动配置生效情况
  • /actuator/env:检查配置文件加载值
  • /actuator/mappings:验证 controller 映射
  • /actuator/metrics:jvm 内存、线程、http 请求统计

三、本地环境模拟

4.docker compose 一键模拟中间件

docker-compose.yml 示例

version: '3.8'
services:
  mysql:
    image: mysql:8.0
    ports:
      - "3306:3306"
    environment:
      mysql_root_password: root
      mysql_database: test
    volumes:
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql
  
  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"
  
  kafka:
    image: confluentinc/cp-kafka:latest
    ports:
      - "9092:9092"
    environment:
      kafka_advertised_listeners: plaintext://localhost:9092
  
  nacos:
    image: nacos/nacos-server:v2.2.3
    ports:
      - "8848:8848"
    environment:
      mode: standalone

启动命令docker-compose up -d

优势:团队协作环境一致,ci/cd 可直接复用。

5.内存数据库快速测试

场景:单元测试无需连接真实数据库。

// 测试类配置
@springboottest
@testpropertysource(locations = "classpath:application-test.yml")
public class userservicetest {
    // 使用 h2 内存数据库
}

// application-test.yml
spring:
  datasource:
    url: jdbc:h2:mem:testdb
    driver-class-name: org.h2.driver
  sql:
    init:
      mode: always
      schema-locations: classpath:schema-h2.sql

四、代码增强与热部署

6.spring boot devtools 热部署

配置

<dependency>
    <groupid>org.springframework.boot</groupid>
    <artifactid>spring-boot-devtools</artifactid>
    <optional>true</optional>
</dependency>

特性

  • 自动重启:classpath 文件变动触发应用重启(比冷启动快 80%)
  • livereload:浏览器/前端资源自动刷新
  • 远程调试:支持远程应用热更新

7.jrebel 商业热部署(终极方案)

优势真正的热交换,无需重启,支持类结构修改(增删方法、字段)。

使用步骤

  1. 安装 idea 插件
  2. 激活许可证
  3. 启动时选择 jrebel debug
  4. 修改代码后 ctrl + shift + f9 编译当前文件即时生效

五、单元测试与 mock

8.spring boot test 最佳实践

@springboottest(webenvironment = webenvironment.random_port)
@autoconfiguremockmvc
class usercontrollertest {
    @autowired
    private mockmvc mockmvc;
    
    @mockbean
    private userservice userservice; // 自动注入 mock 对象
    
    @test
    void testgetuser() throws exception {
        // 打桩
        when(userservice.getuser(1l)).thenreturn(new user("test"));
        
        mockmvc.perform(get("/api/users/{id}", 1l))
               .andexpect(status().isok())
               .andexpect(jsonpath("$.name").value("test"));
        
        verify(userservice, times(1)).getuser(1l);
    }
}

9.mock 中间件(embedded)

@testconfiguration
public class testredisconfig {
    @bean
    public redisserver redisserver() {
        return redisserver.newredisserver().start(); // 嵌入式 redis
    }
}

支持组件

  • embedded rediscom.github.kstyrc:embedded-redis
  • embedded kafkaspring-kafka-test
  • embedded mongodbde.flapdoodle.embed:de.flapdoodle.embed.mongo

六、高级调试技巧

10.远程调试(remote debug)

场景:调试部署在测试环境/容器中的应用。

启动 jvm 参数

java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005 -jar app.jar

idea 配置

  1. run → edit configurations → + remote jvm debug
  2. host: 测试服务器ip port: 5005
  3. 点击 debug 图标连接

docker 中开启

from openjdk:17
expose 5005
cmd ["java", "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005", "-jar", "app.jar"]

11.jmx 监控与 jvisualvm

启动参数

-dcom.sun.management.jmxremote
-dcom.sun.management.jmxremote.port=9999
-dcom.sun.management.jmxremote.authenticate=false
-dcom.sun.management.jmxremote.ssl=false

jvisualvm 连接jvisualvm → 右键 local → jmx connection → localhost:9999

功能

  • 查看堆内存、线程、类加载
  • sampler:cpu/内存采样分析
  • profiler:性能剖析
  • mbeans:查看 spring beans 状态

12.arthas 线上诊断神器

场景:生产环境无法远程调试,需动态诊断。

安装使用

curl -o https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar # 选择 java 进程

核心命令

  • watch:查看方法入参/返回值
    watch com.example.service.userservice getuser '{params, returnobj}' -x 2
    
  • trace:方法内部调用耗时追踪
    trace com.example.service.userservice getuser -n 5 --skipjdkmethod false
    
  • jad:反编译类查看源码
    jad com.example.service.userservice
    
  • ognl:执行 spel 表达式(查看/修改字段)
    ognl '@com.example.config.globalconfig@static_field'
    
  • dashboard:实时系统监控

七、多线程与异步调试

13.线程 dump 分析

命令行

# 查看 java 进程
jps

# 生成线程 dump
jstack <pid> > thread.dump

在线分析:https://fastthread.io/ 或 https://jstack.review/

关键状态

  • blocked:等待锁,需定位死锁
  • waiting:等待条件唤醒
  • timed_waiting:sleep 或定时等待

14.异步任务调试

@service
public class asyncservice {
    @async
    public completablefuture<user> asyncgetuser(long id) {
        // 断点会命中,但线程名是 task-1/task-2
        return completablefuture.completedfuture(usermapper.selectbyid(id));
    }
}

idea 调试技巧

  • all:查看所有线程堆栈
  • thread:仅查看当前线程(避免断点干扰其他线程)
  • mute breakpoints:临时禁用断点,让程序运行到特定位置

八、网络与 http 调试

15.mockserver 模拟外部 api

@beforeeach
void setup() {
    mockserver = clientandserver.startclientandserver(1080);
    
    // 配置 mock 响应
    mockserver.when(
        request()
            .withmethod("post")
            .withpath("/api/payment")
    ).respond(
        response()
            .withstatuscode(200)
            .withbody("{\"status\":\"success\"}")
    );
}

16.wireshark/tcpdump 抓包分析

# 抓取 8080 端口的 http 请求
sudo tcpdump -i any -w capture.pcap port 8080

# 用 wireshark 打开分析
wireshark capture.pcap

九、专项调试工具

17.内存溢出(oom)分析

启动参数保留堆 dump

-xx:+heapdumponoutofmemoryerror
-xx:heapdumppath=/path/to/dump.hprof
-xx:+printgcdetails
-xx:+printgcdatestamps
-xloggc:/path/to/gc.log

分析工具

  • eclipse mat:分析堆 dump,定位内存泄漏
  • jhat:jdk 自带轻量分析
    jhat dump.hprof
    

18.sql 调试

mybatis 日志

logging:
  level:
    com.example.mapper: debug # 打印 sql 和参数

p6spy 监控

<dependency>
    <groupid>p6spy</groupid>
    <artifactid>p6spy</artifactid>
</dependency>

自动打印 sql 执行时间,识别慢查询。

十、调试效率提升技巧

19.idea 书签与断点技巧

  • f11:匿名书签
  • ctrl + f11:带数字的书签(1-9)
  • ctrl + 1-9:跳转到数字书签
  • 断点分组:右键断点 → move to group,管理复杂场景

20.spring boot 调试模式

# 开启 debug 日志
java -jar app.jar --debug

# 查看自动配置报告
java -jar app.jar --debug > auto-config-report.txt

# 启动时打印 bean 创建过程
-dlogging.level.org.springframework.beans.factory=debug

总结:调试方法论

问题类型首选工具备选方案
业务逻辑错误idea 断点调试日志 + 单元测试
环境问题docker composeembedded 组件
性能问题jvisualvm/arthasjprofiler(商业)
生产问题arthas远程 debug
并发问题jstack + 线程分析jmc(java mission control)
内存泄漏eclipse matjprofiler

黄金法则先在单元测试中复现,再用断点/日志定位,最后工具分析。调试是系统性工程,结合多种手段才能事半功倍。

到此这篇关于java后端本地调试实用方法总结大全的文章就介绍到这了,更多相关java后端本地调试内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com