项目阶段工作#
第一阶段:2022-2023#
核心目标:从零构建操作系统源代码级调试工具,打通内核/用户态联合调试的基本链路。
- 基于开源的 GDB/LLDB 调试前端 WebFreak001/code-debug 进行 fork,实现 VS Code 扩展的基本架构(DAP 协议交互、GDB/MI 接口控制 GDB),支持 QEMU 虚拟机远程调试
- 提出并实现断点组核心概念:断点按所在地址空间分组,任意时刻只有当前地址空间对应的断点组生效;切换时符号表动态加载/卸载,实现内核态 ↔ 用户态的边界检测与自动切换;以 rCore-Tutorial 作为首个适配目标验证联合调试的可行性
- 实现 eBPF 调试面板(WebView)与基于 eBPF 的内核态、用户态代码动态跟踪,与 GDB 静态断点调试形成互补
- 实现内存读写、寄存器查看(RISC-V)、断点表展示等调试界面功能
- 本阶段遗留问题:断点不在 VS Code 中显示、边界断点与内核符号表耦合、缺少单步步进、控制台输出杂乱、插件包过大、配置硬编码等,成为下一阶段的主要工作内容
第二阶段:2023-2024#
核心目标:全面完善调试器的可用性和通用性,扩展对不同语言(C 语言)和不同运行环境(真实硬件)的支持。
功能完善#
- 修复第一阶段遗留问题:利用
debug.addBreakpointsAPI 解决断点显示;边界断点重构为断点组的属性(支持customRequest动态设置与右键菜单);引入OSStateMachine状态机架构(4 状态、5 事件、8 种动作)重构切换流程;实现单步步进与 Continue 按钮适配;优化控制台输出;插件包瘦身;配置文件去硬编码(引入filePathToBreakpointGroupNames、breakpointGroupNameToDebugFilePaths两个映射函数)
新增功能#
- 钩子断点(Hook Breakpoints):断点触发时执行自定义 JavaScript 函数,在进程调度处自动获取即将被调度的用户进程名称,返回值设置
nextBreakpointGroup - SSH 远程调试:密钥/密码认证、X11 转发、远程/本地源文件路径自动映射
- 多进程调试:断点组动态创建,支持同时调试多个用户态进程
- 更名为 “OS Debugger” 发布到 VS Code Extension Marketplace,发布 v2.0.0 里程碑版本
新平台适配#
- xv6(C 语言):调试工具栏对所有语言可见;支持多边界断点(
usys.S中多个ecall出口);编写 xv6 专用launch.json模板(virt机器、128M 内存、2 SMP 核心);适配用户程序命名规则(_filename)与钩子断点 - 真实硬件(昉·星光 2 开发板):通过 JTAG 接口集成 OpenOCD;实现 U-Boot 加载操作系统的调试流程;适配 DCSR 寄存器限制(边界断点设在
ecall前一条指令)
工程化改进#
- 支持 RISC-V 汇编文件断点;寄存器查看(从上游合并);一键安装脚本(Shell);合并上游多项改进(静态变量支持、STL 容器解析修复、GDB Frame Filters 支持等)
第三阶段:2024-2025#
核心目标:提升调试器的稳定性和实用性,修复实际使用中的关键 bug,整理项目仓库,开展 Rust 异步调试功能的研究与开发。
Bug 修复与稳定性提升#
- 修复"只能调试到一号进程"的问题,使多进程调试能力真正可用
- 发布 v2.0.1 修复版本
Rust 异步跟踪方案#
在 code-debug_Asynchronous-trace 仓库完成 Rust 异步跟踪方案的设计与实现(工作集中于 2025 年下半年):
- 实现异步回溯(async backtrace)工具:基于 DWARF 分析与插桩框架,获取异步函数的逻辑调用关系
- 修复协程实例编号(coroutine id)的识别问题;改进日志输出,在 poll 函数进出时记录异步回溯;调试器运行中实时打印异步回溯的变化
- 支持 async 块(
{async_block#})等更多异步结构的追踪;完成多协程场景的测试 - 基于 LLVM IR 生成调用图,添加子图生成器辅助查看;支持追踪被异步函数调用的同步函数
- 年底完成仓库清理:重构 Makefile(清晰分离 deps/gdb/run 等操作),移除临时分析脚本
仓库整理#
- 重新组织项目文件结构,整理历史文档和工作记录
- 完善安装说明文档
第四阶段:2025-2026#
核心目标:适配组件化 Rust 操作系统,实现异步调试的插件化与界面化,融合异步调试与跨特权级调试,完成对 Rust 异步操作系统的调试支持。
OSGDB:组件化操作系统适配与特殊断点改造#
在 osgdb 仓库完成:
- 完成对组件化 Rust 操作系统(StarryOS)的调试适配
- 边界断点改造:支持通过
function字段按函数名设置与删除;管理函数名边界断点在断点组切换时的生命周期;支持源码注释标记(marker)机制;修复 PC 切换后的边界处理时序 - 钩子断点改造:实现
captureConsoleOutput,利用 GDB 顺序处理命令的保证圈定 console 输出范围,使钩子函数可以正确读取 RustString变量,自动兼容不同 Rust 版本;钩子切换创建的断点组自动注入 user_to_kernel 边界
Async-Debuger:插件化与界面#
在 async-debug 仓库完成:
- 在 2024-2025 方案的基础上优化异步跟踪方案,实现 VS Code 调试插件(调试类型
ardb) - 实现 Async Inspector 面板:以树形图展示等待边与调用边构成的逻辑调用栈,树节点区分内核态与用户态
- 实现白名单(whitelist)机制与追踪根(trace root)设置,支持自动推断追踪根
- 在 embassy(面向嵌入式设备的 Rust 异步运行时)上验证
- 适配 riscv、aarch64 等架构
融合:跨特权级异步跟踪#
- 在 attach 模式下使异步追踪与 OS 调试并行工作
- 融合异步跟踪与跨特权级调试两个功能,实现对 Rust 异步操作系统的调试:在调试异步内核时,既可以跨内核态/用户态设置断点与单步调试,也可以查看异步任务的逻辑调用栈
未来规划#
解决调试器单步和状态机转换机制导致OS启动慢的问题;
实现多线程跟踪调试;
(GDB本身是具备多线程调试能力的,但是异步跟踪机制并未进行相应的功能适配,所以目前不具备多线程运行异步任务的执行流恢复功能)
- AxVisor + eBPF,实现跨特权级异步OS信息采集
因为我们的跨特权级调试具有很强的时序侵入性,所以没办法和eBPF直接结合。async-debug 用于异步逻辑执行流的恢复,而eBPF能够从时间、时序等维度进行采集, AxVisor 能够实现跨特权级的不同维度信息采集。
将 async-debug 模块化,降低后续新功能的侵入性;
调试功能针对硬件进行适配;