[功能] 完善 macOS Java Debug 并将通用能力下沉 Rust Core
Maintainers usually reply within 1 day
@1lck is already working on this.
Since Aug 29, 2026.
Assessment
This issue has not been assessed yet.
Description
目标
让 Java 项目在 Lithe macOS 端具备接近 IntelliJ IDEA 的核心调试体验。使用成熟的 Java Debug Server 控制 JVM,不继续扩展现有 jdb 文本解析方案。
本 Issue 的完整交付范围包括 Java 源码项目、Maven、Gradle、Spring Boot、Quarkus、Micronaut、JUnit、TestNG,以及远程 JVM/Tomcat。Kotlin、Scala、Groovy 的语言专属调试体验不在本次范围内。
Windows 暂不修改。通用能力从一开始进入 Rust Core,待 macOS 验证稳定后,Windows 只需要接入共享接口并实现自身 UI 和平台传输。
总体架构
macOS UI
-> Rust Debug Core
-> Java Debug Server
-> Target JVM
- Rust Core:调试协议、会话状态、断点、线程、调用栈、变量、命令、错误、取消和超时。
- Java Debug Server:真正连接和控制 JVM。
- JDT LS:提供项目结构、主类、模块、依赖、源码和调试服务启动入口。
- macOS:进程、端口连接、终端、快捷键、持久化和 SwiftUI/AppKit 展示。
Java Debug Server 应随应用固定版本分发,并与现有 JDT LS 版本配套。不得要求用户手工安装适配器或配置 LITHE_JAVA_DEBUG_PATH。
项目运行使用用户选择的项目 JDK;JDT LS 和 Java Debug Server 继续使用 Lithe 自带的工具 JDK。
项目与启动能力
- 普通 Java 主类启动调试
- Maven 单模块和多模块项目
- Gradle 单模块和多模块项目
- Spring Boot、Quarkus、Micronaut 等 JVM 服务
- JUnit、TestNG 单个测试、测试类和测试集合
- 从运行配置启动调试
- 支持主类、模块、JDK、参数、VM 参数、环境变量和工作目录
- 远程 JVM/Tomcat Attach
- 本机调试停止时可终止目标进程
- 远程调试停止时只断开连接,不终止远程 JVM
- 多个调试会话独立显示和管理
框架和构建工具不实现独立调试器。它们只负责生成正确的启动配置,最终统一复用 Java 调试通道。
断点能力
- 行断点
- 条件断点
- 命中次数断点
- 日志断点,不暂停程序
- 捕获异常和未捕获异常断点
- 方法断点
- 字段读写断点
- 启用、禁用、删除和全部清除
- 一键静音全部断点
- 显示已绑定、等待绑定和绑定失败
- 调试重启后自动恢复断点
- 断点按工作区保存在本机,不写入项目 Git 文件
- 编辑器源码变更后正确更新断点位置
执行控制
- 启动、暂停、继续、停止和重新运行
- 远程连接和安全断开
- 步过、步入和步出
- 强制步入
- 智能步入,在一行多个调用中选择目标
- 运行到光标
- 后端支持时允许返回上一栈帧
- 默认跳过 JDK、反射、代理和框架内部代码
- 支持配置包过滤规则
- 后端能力必须经过协商;不支持的操作不显示无效按钮
暂停与数据检查
- 暂停后自动打开源码并高亮当前执行行
- 线程列表和线程状态
- 完整调用栈及源码跳转
- 局部变量、参数、成员变量和静态变量
- 对象、数组和集合逐层展开
- 大数组和大集合分页加载
- 监视表达式
- 临时表达式求值
- 鼠标悬停查看变量
- 编辑变量值
- 当前行内联显示变量结果
- 异常暂停时显示异常类型、信息和对象
- 切换线程或栈帧时同步刷新变量和表达式
- 使用会话 ID 和操作 ID 丢弃旧请求结果,防止旧数据覆盖当前界面
控制台与交互
- 展示标准输出和错误输出
- 支持需要标准输入的 Java 程序
- Debugger 与 Console 分页
- Spring Boot 等长日志场景保持流畅
- 启动失败时明确指出 JDK、主类、模块、端口或依赖问题
- 调试服务意外退出时提供重新启动或重新连接路径
macOS 交互
- 编辑器行号区直接添加和删除断点
- 断点右键编辑条件、次数和日志
- 固定调试工具栏和 IDEA 风格快捷键
- 线程、调用栈、变量、监视和控制台布局清晰
- 独立断点管理窗口
- 当前执行行、当前栈帧、异常位置和断点状态有明确视觉区分
- 点击调用栈和断点可准确跳转源码
- 变量树支持逐层展开,不用平铺替换当前列表
Rust Core 改造
- 在
rust/lithe-core建立平台和语言无关的 Debug 模块 - 定义稳定的会话、断点、线程、栈帧、变量、求值、能力和错误模型
- 将通用协议封包、请求匹配、事件排序和状态机从 Swift 迁入 Rust
- 支持请求超时、取消、会话编号和过期结果丢弃
- 使用工作区相对路径、单基行号、确定性排序和稳定错误码
- 增加共享 JSON 契约与测试夹具
- macOS 仅保留平台进程、端口传输、终端和 UI
- 保持接口可供未来 Windows 接入,但本 Issue 不修改 Windows 产品代码
Java Debug Server 接入
- 固定并记录 Java Debug Server 与 JDT LS 的兼容版本
- 补齐许可证、来源、校验和和打包流程
- 由 JDT LS 启动 Java Debug Server,并获得本机调试端口
- macOS 建立平台连接,Rust Core 负责协议和会话
- 使用 JDT LS 的项目模型解析主类、模块、源码和依赖
- 不再靠文件路径猜测主类和模块
- 完成后删除 Java
jdb文本解析和旧的双界面路径 - 不长期保留两套 Java Debug 实现或静默回退
资源与生命周期
- 未使用 Debug 时不创建调试会话、不启动目标 JVM、不打开调试端口
- Java Debug Server 仅在用户开始调试时激活
- 调试结束后释放连接、线程、调用栈、变量树和目标进程
- Debug 模块继续按需加载,并在空闲后休眠
- 活跃调试会话持有模块资源,防止运行中错误休眠
- 停止、重启、项目关闭和应用退出都能完整清理资源
- JDT LS 可因 Java 代码智能继续运行,但不得遗留额外 Debug 会话
实施顺序
- 定义 Rust Debug 契约、状态和错误。
- 将通用调试协议与会话管理迁入 Rust。
- 固定并接入 Java Debug Server。
- 打通普通 Java、Maven、Gradle和 JVM 框架项目。
- 接入测试调试与远程 JVM。
- 完成断点类型和执行控制。
- 完成线程、调用栈、变量、监视和求值。
- 完成 macOS Debug 工具窗口和编辑器联动。
- 删除旧
jdb路径并统一 Java Debug。 - 使用真实项目矩阵完成稳定性、性能和体验验收。
验证矩阵
- 普通 Java 单文件和标准源码目录
- Maven 单模块和多模块
- Gradle Groovy DSL 和 Kotlin DSL,单模块和多模块
- Spring Boot 服务及配置参数
- JUnit 和 TestNG
- 本机启动和远程 Attach
- 条件、次数、日志、异常、方法和字段断点
- 多线程、深调用栈、大对象、大数组和循环引用
- 标准输入、长日志、目标进程异常退出和调试服务异常退出
- 重启、快速停止重开、项目关闭和应用退出
- Debug 模块空闲休眠与无额外调试进程
- Rust Core 契约、macOS 单元测试和端到端真实 JVM 测试
完成标准
- 断点能稳定绑定,失败原因可见。
- 暂停源码位置准确,当前执行行自动打开。
- 单步操作稳定,默认不会频繁进入 JDK 和框架内部代码。
- 线程、调用栈、变量、对象展开、监视和表达式求值可靠。
- 重启和快速重复操作不会出现旧会话数据或资源残留。
- 远程断开不会误杀目标 JVM。
- 未使用 Debug 时没有额外调试进程和大型会话数据。
- macOS 端只有一套 Java Debug 路径,通用能力位于 Rust Core。
- Dominant language
- TypeScript
- Stars
- 1.8k
- Forks
- 151
- Avg merge
- 7h 51m
- Merged PRs (30d)
- 351
Getting set up
This project ships no dev container, Dockerfile or contributing guide, so setting up is up to you: start from its README, and see our first-contribution guide for the general steps.
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from 1lck/Lithe-IDEA
-
area:editor bug P0 platform:macos review: low
Difficulty 2/5 1-3 hours Newbie friendliness 65/100
1lck/Lithe-IDEA#1118 · 2 comments ·
Maintainers usually reply within 1 day
-
area:editor issue-form:feature P1 platform:windows review: low
Difficulty 3/5 1-2 days Newbie friendliness 52/100
1lck/Lithe-IDEA#1129 ·
Maintainers usually reply within 1 day
-
area:editor issue-form:feature P1 platform:windows review: low
Difficulty 4/5 3-5 days Newbie friendliness 48/100
1lck/Lithe-IDEA#1128 ·
Maintainers usually reply within 1 day
-
[Feature] 修复commit区按钮、弹窗、下拉框样式Possibly taken @arkleselect claimed this 1 day ago. Openarea:ui enhancement issue-form:feature P1 platform:macos review: medium
1lck/Lithe-IDEA#1125 · 1 assignee ·
Maintainers usually reply within 1 day
-
[Bug] Windows 版本对比重复显示相同内容Possibly taken @puppyben1 claimed this 1 day ago. Openarea:git bug P0 platform:windows review: low
Difficulty 3/5 1-2 days Newbie friendliness 38/100
1lck/Lithe-IDEA#1123 · 4 comments ·
Maintainers usually reply within 1 day
Similar issues
-
Flaky: mongodb-memory-server 'Port already in use' when another process starts a mongod concurrentlyOpenarea:testing bug effort:S priority:P2
Difficulty 2/5 1-3 hours Newbie friendliness 70/100
Maintainers usually reply within 1 day
-
lens:agent lens:process process
Difficulty 2/5 1-3 hours Newbie friendliness 82/100
thebristolsound/birdbrain#1772 ·
Maintainers usually reply within 1 day
-
bug priority:low ready-for-dev
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 70/100
Automattic/data-liberation-agent#685 ·
Maintainers usually reply within 1 day
-
Business
Difficulty 2/5 1-3 hours Newbie friendliness 66/100
Maintainers usually reply within 1 day