项目全景#
初次接触本项目的开发者建议从本文开始,了解整个项目的来龙去脉与各子项目的分工。
我们做什么#
OS Debug 是面向操作系统开发的源代码级调试工具,目前在 VS Code 中提供三条调试能力线:
- OSGDB —— 跨特权级源代码单步调试。在常规 GDB 中,当特权级切换时,原特权级代码中设置的断点会失效,也无法在一个特权级运行时给另一个特权级代码设置断点。OSGDB 通过断点组机制自动处理地址空间切换,可以在内核代码和用户程序中同时设置断点。
- Async-Debuger —— Rust 异步(协程)程序调试。在异步执行逻辑中,常规 GDB 给出的物理调用栈无法完整反映异步函数之间的调用关系:异步函数调用时只创建异步实例,真正的执行发生在实例被 poll 时;poll 返回后本次的物理栈帧即被销毁,实例可能在其他协程上被继续执行,此前的逻辑调用关系随之丢失。Async-Debuger 从 GDB 动态获取协程信息,重建异步函数、同步函数的逻辑调用栈,不依赖特定异步运行时。
- 跨特权级异步跟踪。异步调试与跨特权级调试的融合能力:在调试 Rust 异步内核时,既可以跨内核态/用户态设置断点与单步调试,也可以查看异步任务的逻辑调用栈。功能已基本实现,但由于调试方案的设计,跟踪的时间消耗很大,后续会进行优化。
此外还有一条规划中的能力线:eBPF 动态调试——结合 GDB 断点与插桩的方式,设计基于白名单的动态函数调用跟踪方法。
项目缘起#
操作系统课上,同学们的内核代码调试手段主要还是在代码中加 printk() 输出信息,很难像应用程序开发那样有一个集成的开发环境,可以方便地进行源代码级的动态跟踪和调试。于是一群对工具感兴趣的人一起开始了这个开源社区项目,希望通过开源社区的持续努力改善这一现状。
项目目标#
我们希望在各种代码执行环境中,及时、准确地获取代码执行信息,并以可视化的方式展现。具体分三个层面:
代码执行环境#
- 不同特权级:用户模式、内核模式、虚拟机监控模式、机器模式
- 不同虚拟化环境:QEMU 模拟器、虚拟机、物理 CPU
- 不同源代码开发语言:C 语言、Rust 语言
信息获取#
- 当前执行代码与源代码的对应关系信息(符号信息)
- 函数调用栈
- 进程、线程和协程的控制块
- 系统调用、中断、异常等事件
- 调度器中各种队列数据结构
- 内存分配和释放情况
信息展现#
- 在 VS Code 和浏览器中,获取信息的当前状态和历史变化的及时、准确可视化展现
- 代码信息展现:源代码行号、函数名等
- 数据结构和相互关系展现:函数调用关系图、火焰图等
各子项目状态与仓库#
| 子项目 | 仓库 | 状态 |
|---|---|---|
| OSGDB(跨特权级调试) | OSDebugger/osgdb | 已适配 rCore、StarryOS |
| Async-Debuger(异步调试) | OSDebugger/async-debug | 已实现插件与界面,在 embassy 上验证;跟踪优化与融合工作在此仓库进行 |
| 异步跟踪方案(2024-2025) | OSDebugger/code-debug_Asynchronous-trace | 已停止更新;Rust 异步跟踪方案的起点 |
| 旧代码仓库 | chenzhiy2001/code-debug | 已停止更新;项目的起点,2022-2024 的工作在此完成 |
| eBPF 动态调试 | — | 规划中 |
如何跑起来#
文档地图#
| 文档 | 内容 |
|---|---|
| 开发环境搭建 | 插件源码的获取、构建与调试 |
| OSGDB 架构设计 | 状态机、断点组、边界断点、钩子断点的设计与实现 |
| 异步调试设计与实现 | 逻辑调用栈重建、从 GDB 动态获取协程信息 |
| eBPF 动态跟踪设计 | eBPF 跟踪方案(规划中) |
| 贡献指南 | 如何参与开发 |
| 路线图 | 项目的开发历程与未来规划 |