项目阶段工作#

第一阶段: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.addBreakpoints API 解决断点显示;边界断点重构为断点组的属性(支持 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 输出范围,使钩子函数可以正确读取 Rust String 变量,自动兼容不同 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 模块化,降低后续新功能的侵入性;

  • 调试功能针对硬件进行适配;