Java调试

Polar Sponsor
爱发电 赞助
.NET 9.0

通过 JDWP 实现 Java 远程调试:连接远程 JVM、设置断点、单步执行代码、查看变量值、获取调用栈。适用于需要调试远程 Java 应用、排查运行时状态、追踪代码执行流程的场景。 术语注解 JDWP:Java Debug Wire Protocol,Java 调试有线协议(Java 远程调试底层通信协议) remote JVM:远程 Java 虚拟机 step through code:代码单步调试(步入 / 步过 / 步出调试) inspect variables:变量查看 / 变量检视 stac

Java Remote Debug

功能概述

Java Remote Debug是一项面向实际任务的技能,主要用于该技能用于在源码目录中调试远程 Java 进程;连接启用了 JDWP 的远程 JVM;

核心要点

  • 在业务类上设置断点、条件断点、方法断点;
  • 查看断点现场的局部变量、对象字段和调用栈;
  • 单步执行,或步出并查看返回值;

使用与执行

在缺少 -g:vars 时,结合源码恢复方法参数名;本机可用 node;远程 JVM 已开启 JDWP 调试端口;当前工作目录最好是对应项目的源码。它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。

结果检查与注意事项

从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。

Java Remote Debug

该技能用于在源码目录中调试远程 Java 进程。

适用场景

  • 连接启用了 JDWP 的远程 JVM
  • 在业务类上设置断点、条件断点、方法断点
  • 查看断点现场的局部变量、对象字段和调用栈
  • 单步执行,或步出并查看返回值
  • 在缺少 -g:vars 时,结合源码恢复方法参数名

前提条件

  • 本机可用 node
  • 远程 JVM 已开启 JDWP 调试端口
  • 当前工作目录最好是对应项目的源码根目录

远程 JVM 启动参数示例:

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

使用方式

在技能目录执行:

node cli.js 

如果你是在项目源码目录中调用技能,建议显式指定工作区根目录:

JAVA_DEBUG_WORKSPACE_ROOT=$PWD node /path/to/java-remote-debug/cli.js 

说明:

  • cli.js 会自动拉起本地调试服务
  • 默认使用当前目录作为源码工作区
  • 源码工作区用于参数名恢复和源码路径断点解析

常用命令

连接远程 JVM:

node cli.js connect 127.0.0.1:5005

查看状态:

node cli.js status

断开连接:

node cli.js disconnect

查看线程:

node cli.js threads

查看当前调用栈:

node cli.js stack

查看当前变量:

node cli.js vars

继续执行:

node cli.js continue

等待断点命中:

node cli.js wait 60000

查看当前断点现场:

node cli.js inspect

查看所有断点:

node cli.js breakpoints

查看对象字段(对象 ID 可从 vars 输出中获取):

node cli.js fields 23379
node cli.js fields 23379 --maxDepth 2

列出已加载类:

node cli.js classes 'com.example.*'

断点用法

按类名和行号下断点:

node cli.js bp com.example.order.OrderController:81

按源码路径和行号下断点:

node cli.js bp src/main/java/com/example/order/OrderController.java:81

按方法名下断点:

node cli.js bp com.example.order.OrderController#queryList

按重载方法下断点:

node cli.js bp 'com.example.order.OrderController#queryList(java.lang.String,int)'

行断点加条件:

node cli.js bp com.example.order.OrderController:81 --if 'pageNo == 1'

方法断点加条件:

node cli.js bp 'com.example.order.OrderController#queryList(java.lang.String,int)' --if 'keyword != null'

清除断点:

node cli.js clear 12
node cli.js clear com.example.order.OrderController:81

单步调试

步过:

node cli.js step over

步进:

node cli.js step into

步出:

node cli.js step out

服务管理

通常不需要手工管理,本地服务会由 cli.js 自动启动。

如果需要手工启动或停止:

node cli.js server start --port 4711
node cli.js server stop

环境变量

  • JAVA_DEBUG_WORKSPACE_ROOT:源码工作区根目录。默认是当前目录
  • JAVA_DEBUG_SERVER_PORT:本地调试服务端口。默认 4711
  • JAVA_DEBUG_SERVER_HOST:本地调试服务地址。默认 127.0.0.1

变量查看说明

vars 命令会优先显示真实局部变量。

如果目标类缺少 LocalVariableTable,会自动回退到 slot 推断模式。

如果当前工作区中能定位到对应源码,还会尝试恢复方法参数名,因此你看到的结果可能是:

  • 真实局部变量名
  • 源码恢复后的方法参数名
  • 回退后的 arg0、arg1

当前能力边界:

  • 对方法参数名恢复支持较好
  • 不保证恢复方法体内部所有局部变量名
  • 如果源码与远程运行版本不一致,恢复结果可能不准确

对象查看说明

vars 命令中的复杂对象显示为 ,可用 fields 命令查看其字段。

fields 命令会自动做一些友好化展示:

  • 自动展开第一层对象字段
  • 自动解析 String
  • 自动拆箱包装类型(Integer → 数字)
  • ArrayList 自动展开元素内容,空列表显示 [],有元素显示 [elem1, elem2] (size=N)
  • HashSet/LinkedHashSet/TreeSet 同样自动展开元素
  • HashMap/LinkedHashMap 自动展开为 {key1=value1, key2=value2} (size=N)

如果 List 中的元素是对象,会显示对象 ID,可继续用 fields 逐层钻取。

典型流程

1. connect 连接远程 JVM
2. bp 设置断点
3. wait 等待断点命中
4. inspect / vars / stack 查看现场
5. fields  查看对象字段和集合内容
6. fields  逐层钻取嵌套对象
7. step over / into / out 单步调试
8. continue 继续执行
9. disconnect 结束调试

注意事项

  • 设置断点前,目标类需要已经加载
  • 断点命中后线程会挂起,需要继续执行或单步
  • 方法断点依赖行号信息;如果类缺少行号调试信息,可能无法定位第一条可执行语句
  • 条件断点当前适合简单比较,如 ==、!=、null 判断
  • 如果端口冲突,可调整 JAVA_DEBUG_SERVER_PORT 或 server start --port

相关专题

更多
IntelliJ IDEA调试技巧汇总
IntelliJ IDEA调试技巧汇总

本合集讲解 IDEA 断点调试、条件断点、远程调试、微服务链路调试、内存快照分析、异常定位高级用法,解决 Java 项目排查难题。

2026.08.11

51

15

Java Spring Boot多租户架构设计与数据隔离实战
Java Spring Boot多租户架构设计与数据隔离实战

本专题聚焦 Java 企业级系统中的多租户架构设计,讲解数据隔离策略、租户路由机制、数据库分库分表方案以及权限控制模型。通过真实 SaaS 系统案例,帮助开发者构建可扩展的多租户应用架构。

2026.06.29

216

13

Java Spring Boot3响应式编程与WebFlux实战
Java Spring Boot3响应式编程与WebFlux实战

本专题围绕Spring Boot 3中的响应式编程体系展开,系统讲解 WebFlux 的非阻塞模型、Reactive Streams、Mono 与 Flux 使用方式,以及在高并发场景下的性能优势。结合真实后端案例,帮助开发者构建低延迟、高吞吐的响应式服务架构。

2026.06.22

180

17

Java分布式事务与Seata实战架构设计
Java分布式事务与Seata实战架构设计

本专题围绕 Java 分布式系统中的事务一致性问题展开,系统讲解分布式事务的核心理论与解决方案。内容包括 Seata AT/TCC 模式原理、事务协调机制、服务调用链一致性保障以及高并发场景下的数据一致性设计策略。通过真实微服务案例,帮助开发者构建可靠的分布式事务处理体系。

2026.06.16

161

12

Java消息队列与异步解耦实战
Java消息队列与异步解耦实战

系统讲解 Java 中消息队列的集成与应用实践,涵盖消息队列的核心概念(生产者/消费者/Topic/Queue/Exchange)、RabbitMQ 的交换机类型与 Spring AMQP 集成、Kafka 分区/副本/消费者组机制与 Spring Kafka 配置、RocketMQ 事务消息与顺序消息、消息可靠投递(确认机制/持久化/重试)、消费端幂等性保障(唯一ID/去重表)、死信队列与延迟消息处理、消息积压监控与扩容策略,帮助开发

2026.05.18

235

29

Java缓存技术与Redis集成教程合集
Java缓存技术与Redis集成教程合集

系统讲解 Java 项目中缓存技术的选型与实践,涵盖本地缓存方案(HashMap 手动缓存/Guava Cache/Caffeine 高性能缓存)的使用与淘汰策略配置、Redis 数据结构(String/Hash/List/Set/ZSet)在缓存场景的应用、Jedis / Lettuce / Redisson 客户端选型、Spring Cache 注解(@Cacheable/@CachePut/@CacheEvict)的声明式缓存、缓

2026.05.15

402

34

Java容器化部署与Docker实践教程合集
Java容器化部署与Docker实践教程合集

聚焦 Java 应用的容器化与云原生部署,讲解 Dockerfile 编写规范与 Java 应用镜像构建、多阶段构建(Multi-stage Build)减小镜像体积、Jib / Buildpacks 免 Dockerfile 镜像构建方案、JVM 容器感知参数(-XX:MaxRAMPercentage)配置、Docker Compose 编排多服务(应用 + MySQL + Redis)、容器健康检查与资源限制、Kubernetes

2026.05.11

280

26

Java Maven/Gradle 构建与依赖管理合集
Java Maven/Gradle 构建与依赖管理合集

系统讲解 Java 项目构建工具的使用与进阶配置,涵盖 Maven 的 POM 文件结构、生命周期(clean/compile/package/install/deploy)与插件机制、依赖范围(compile/provided/test/runtime)与传递依赖管理、多模块聚合与继承、私有 Nexus 仓库发布,以及 Gradle 的 Groovy / Kotlin DSL 语法、Task 自定义与增量构建、依赖版本目录(Versi

2026.05.09

229

25

Java 函数式接口与 Lambda 进阶技巧
Java 函数式接口与 Lambda 进阶技巧

在 Java Stream 基础之上进一步深入函数式编程,涵盖 @FunctionalInterface 注解与自定义函数式接口设计、四种方法引用(静态/实例/对象/构造器)的使用场景、Lambda 中的 effectively final 变量捕获规则、函数组合(andThen/compose)与柯里化技巧、Comparator 链式比较器构建、CompletableFuture 异步函数式编排、Reactor / RxJava 响应

2026.05.08

248

28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习