通过 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:本地调试服务端口。默认4711JAVA_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
热门AI工具
相关专题
本专题聚焦 Java 企业级系统中的多租户架构设计,讲解数据隔离策略、租户路由机制、数据库分库分表方案以及权限控制模型。通过真实 SaaS 系统案例,帮助开发者构建可扩展的多租户应用架构。
216
2026.06.29
本专题围绕Spring Boot 3中的响应式编程体系展开,系统讲解 WebFlux 的非阻塞模型、Reactive Streams、Mono 与 Flux 使用方式,以及在高并发场景下的性能优势。结合真实后端案例,帮助开发者构建低延迟、高吞吐的响应式服务架构。
180
2026.06.22
本专题围绕 Java 分布式系统中的事务一致性问题展开,系统讲解分布式事务的核心理论与解决方案。内容包括 Seata AT/TCC 模式原理、事务协调机制、服务调用链一致性保障以及高并发场景下的数据一致性设计策略。通过真实微服务案例,帮助开发者构建可靠的分布式事务处理体系。
161
2026.06.16
系统讲解 Java 中消息队列的集成与应用实践,涵盖消息队列的核心概念(生产者/消费者/Topic/Queue/Exchange)、RabbitMQ 的交换机类型与 Spring AMQP 集成、Kafka 分区/副本/消费者组机制与 Spring Kafka 配置、RocketMQ 事务消息与顺序消息、消息可靠投递(确认机制/持久化/重试)、消费端幂等性保障(唯一ID/去重表)、死信队列与延迟消息处理、消息积压监控与扩容策略,帮助开发
235
2026.05.18
系统讲解 Java 项目中缓存技术的选型与实践,涵盖本地缓存方案(HashMap 手动缓存/Guava Cache/Caffeine 高性能缓存)的使用与淘汰策略配置、Redis 数据结构(String/Hash/List/Set/ZSet)在缓存场景的应用、Jedis / Lettuce / Redisson 客户端选型、Spring Cache 注解(@Cacheable/@CachePut/@CacheEvict)的声明式缓存、缓
402
2026.05.15
聚焦 Java 应用的容器化与云原生部署,讲解 Dockerfile 编写规范与 Java 应用镜像构建、多阶段构建(Multi-stage Build)减小镜像体积、Jib / Buildpacks 免 Dockerfile 镜像构建方案、JVM 容器感知参数(-XX:MaxRAMPercentage)配置、Docker Compose 编排多服务(应用 + MySQL + Redis)、容器健康检查与资源限制、Kubernetes
280
2026.05.11
系统讲解 Java 项目构建工具的使用与进阶配置,涵盖 Maven 的 POM 文件结构、生命周期(clean/compile/package/install/deploy)与插件机制、依赖范围(compile/provided/test/runtime)与传递依赖管理、多模块聚合与继承、私有 Nexus 仓库发布,以及 Gradle 的 Groovy / Kotlin DSL 语法、Task 自定义与增量构建、依赖版本目录(Versi
229
2026.05.09
在 Java Stream 基础之上进一步深入函数式编程,涵盖 @FunctionalInterface 注解与自定义函数式接口设计、四种方法引用(静态/实例/对象/构造器)的使用场景、Lambda 中的 effectively final 变量捕获规则、函数组合(andThen/compose)与柯里化技巧、Comparator 链式比较器构建、CompletableFuture 异步函数式编排、Reactor / RxJava 响应
248
2026.05.08
热门下载
相关下载
精品课程
共0课时 | 0人学习
共0课时 | 0人学习
共0课时 | 0人学习
