docs: link debugger agent workflow Signed-off-by: Chao Liu chao.liu@processmission.com
docs: link debugger agent workflow
Signed-off-by: Chao Liu chao.liu@processmission.com
本仓库是搭把手战队的参赛材料仓库。主作品是一套面向 Asterinas Rust 内核的 GDB Helpers 调试方案;同时整理了两位成员在 Asterinas 上游的公开贡献。
RFC 讨论后,调试信号语义与 GDB Helpers 被拆成两条独立、可分别审查的 PR。它们是本作品最直接的上游提交。
Debug
BreakPoint
SIGTRAP
int3
ast-*
状态说明:#3412 目前尚未合并。本仓库只陈述已经实现和验证的能力,不将开放 PR 写成 Asterinas 主线功能。
同时,队员邵志航的两项已合并 Linux 兼容性修复也纳入本次贡献材料,详见后文“其他上游贡献”。
这套方案来自一次真实的进程加载段错误排查。Asterinas 处理 ELF 的 PT_INTERP 段时,需要把动态链接器映射进用户地址空间。排查发现,构建时链接的 Rust 动态库与 rootfs 实际加载的版本不一致:符号名仍可匹配,函数地址已经偏移,随后在 interpreter 和依赖库加载路径中触发 trap。
PT_INTERP
问题不只在于能否连上 GDB,而在于调试 Rust 内核时的重复成本:
UnsafeCell
Mutex
BTreeMap
Arc
Weak
Option
RFC 讨论后,方案收敛为三层高投入回报能力:
RwMutex
SpinLock
astprocess(PID)</code>、<code>ast_process(PID)</code>、<code>astprocess(PID)</code>、<code>ast_thread(TID)
$ast_file_table(PID)
p
因此,helper 解决“如何到达对象”,原生 GDB 继续负责“如何观察任意字段”。开发者不需要为每个新增内核字段等待新的专用命令。
cargo osdk debug 使用 rust-gdb,并自动加载 scripts/gdb/asterinas-gdb.py。用户不必手工维护脚本路径或 .gdbinit。
cargo osdk debug
rust-gdb
scripts/gdb/asterinas-gdb.py
.gdbinit
实现按以下模块分层:
asterinas-gdb.py
gdb_bridge.py
layout.py
printers.py
kernel.py
commands.py
constants.py
Rust 与 Python 的耦合点以 COUPLED 注释标记。配合真实 QEMU + GDB 冒烟测试,可在内核布局或 Rust 工具链变化后及时发现脚本失效,而不是让它悄悄输出错误信息。
COUPLED
ast-version
ast-ps [PID]
ast-threads
ast-pstree
ast-fds PID
ast-uptime
astpidtable()</code>、<code>ast_pid_table()</code>、<code>astpidtable()</code>、<code>ast_process(PID)
astthread(TID)</code>、<code>ast_thread(TID)</code>、<code>astthread(TID)</code>、<code>ast_file_table(PID)
冒烟测试启动真实 QEMU、连接真实 rust-gdb,验证 printer、对象导航与全部 ast-* 命令。通过标志为 SMOKE: all ok 和 [smoke] PASSED;PR #3412 的 gdb-smoke-test 于 2026-07-03 成功完成。
SMOKE: all ok
[smoke] PASSED
配套的 Asterinas Debugger Agent 和 GDB Helper Agent Workflow 在这些稳定的 GDB 原语之上组织会话、断点、观察和探针步骤,用于复用证据驱动的调试 workflow;它不改变 Asterinas 内核,也不替代开发者判断。
pread
pwrite
已于 2026-04-09 合并,3 个提交、11 个文件、+138 / −26。该工作修复 Asterinas 与 Linux 在定位 I/O 错误码上的偏差:
EBADF
ESPIPE
O_PATH
preadv
pwritev
read_at
write_at
lseek
check_positional_io()
PR 同时新增管道 ESPIPE、O_PATH EBADF、nsfs EINVAL 和 /dev/full ENOSPC 的回归测试。
EINVAL
/dev/full
ENOSPC
已于 2026-06-23 合并,2 个提交、3 个文件、+104 / −13。Linux 会在 O_PATH fd 上设置 FMODE_NONOTIFY,从而不产生 fsnotify 事件;Asterinas 原先会把它当作普通 fd,错误触发 IN_OPEN / IN_CLOSE_NOWRITE。
FMODE_NONOTIFY
IN_OPEN
IN_CLOSE_NOWRITE
修复复用 FileLike::status_flags() 判断 O_PATH,在 on_open / on_close 中通过共享的 notifiable_path helper 抑制通知。on_access / on_modify 无需额外处理,因为 O_PATH 的空 Rights 会先使读写以 EBADF 失败。新增 inotify_o_path 回归测试,验证 O_PATH 打开没有事件、普通打开仍有事件。
FileLike::status_flags()
on_open
on_close
notifiable_path
on_access
on_modify
Rights
inotify_o_path
以下按 GitHub author 查询 asterinas/asterinas 的公开记录;“关联 Issue”不等同于该成员创建 Issue,表中只统计作者本人提交的 PR 与 Issue。
ostd
int-to-c-enum
比赛要求包含作品展示视频、方案文档或 PPT 和源代码,并要求成果在 GitLink 平台开源。本仓库先作为 GitHub 协作与材料归档仓库;GitLink 同步由战队手动完成。
同步时请确认:
版权所有:中国计算机学会技术支持:开源发展技术委员会 京ICP备13000930号-9 京公网安备 11010802047560号
第八届 CCF 开源创新大赛|Asterinas(星绽)开源社区贡献
本仓库是搭把手战队的参赛材料仓库。主作品是一套面向 Asterinas Rust 内核的 GDB Helpers 调试方案;同时整理了两位成员在 Asterinas 上游的公开贡献。
作品信息
本作品核心上游提交
RFC 讨论后,调试信号语义与 GDB Helpers 被拆成两条独立、可分别审查的 PR。它们是本作品最直接的上游提交。
Debug、BreakPoint异常映射为SIGTRAP,补齐 LoongArch 的 fault-signal 转换,并添加int3/ 单步回归测试。该兼容性修复从 RFC 中独立出来,避免与脚本实现混合评审。ast-*聚合命令、冒烟测试与 CI。共 6 个提交、25 个文件、+2167 / −9。同时,队员邵志航的两项已合并 Linux 兼容性修复也纳入本次贡献材料,详见后文“其他上游贡献”。
方案概述
这套方案来自一次真实的进程加载段错误排查。Asterinas 处理 ELF 的
PT_INTERP段时,需要把动态链接器映射进用户地址空间。排查发现,构建时链接的 Rust 动态库与 rootfs 实际加载的版本不一致:符号名仍可匹配,函数地址已经偏移,随后在 interpreter 和依赖库加载路径中触发 trap。问题不只在于能否连上 GDB,而在于调试 Rust 内核时的重复成本:
UnsafeCell、锁实现等细节淹没;Mutex、BTreeMap、Arc、Weak与Option;RFC 讨论后,方案收敛为三层高投入回报能力:
Mutex、RwMutex、SpinLock等内部展开压缩成可读值。astprocess(PID)</code>、<code>ast_thread(TID)、$ast_file_table(PID)等变量。ast-*命令p表达式无法完成的集合遍历、表格汇总与树形展示。因此,helper 解决“如何到达对象”,原生 GDB 继续负责“如何观察任意字段”。开发者不需要为每个新增内核字段等待新的专用命令。
自动加载与实现结构
cargo osdk debug使用rust-gdb,并自动加载scripts/gdb/asterinas-gdb.py。用户不必手工维护脚本路径或.gdbinit。实现按以下模块分层:
asterinas-gdb.pygdb_bridge.pylayout.py、printers.pykernel.pycommands.pyconstants.pyRust 与 Python 的耦合点以
COUPLED注释标记。配合真实 QEMU + GDB 冒烟测试,可在内核布局或 Rust 工具链变化后及时发现脚本失效,而不是让它悄悄输出错误信息。调试接口与演示结果
ast-versionast-ps [PID]ast-threadsast-pstreeast-fds PIDast-uptimeastpidtable()</code>、<code>ast_process(PID)、astthread(TID)</code>、<code>ast_file_table(PID)p组合的 GDB 对象。冒烟测试启动真实 QEMU、连接真实
rust-gdb,验证 printer、对象导航与全部ast-*命令。通过标志为SMOKE: all ok和[smoke] PASSED;PR #3412 的 gdb-smoke-test 于 2026-07-03 成功完成。配套的 Asterinas Debugger Agent 和 GDB Helper Agent Workflow 在这些稳定的 GDB 原语之上组织会话、断点、观察和探针步骤,用于复用证据驱动的调试 workflow;它不改变 Asterinas 内核,也不替代开发者判断。
交付物
其他上游贡献
邵志航:已合并的 Linux 兼容性修复
PR #3086:修复
pread/pwrite定位 I/O 错误处理已于 2026-04-09 合并,3 个提交、11 个文件、+138 / −26。该工作修复 Asterinas 与 Linux 在定位 I/O 错误码上的偏差:
pread/pwrite原先先做权限检查而返回EBADF;Linux 先检查可定位 I/O 能力,因此应优先返回ESPIPE;O_PATHfd 在零长度或空 iov 的preadv/pwritev中会绕过read_at/write_at,错误返回成功;修复后返回EBADF;lseek,旧抽象无法表达这一差异;新增check_positional_io()默认方法,仅由 nsfs 覆写。PR 同时新增管道
ESPIPE、O_PATHEBADF、nsfsEINVAL和/dev/fullENOSPC的回归测试。PR #3117:抑制
O_PATHfd 的 fsnotify 事件已于 2026-06-23 合并,2 个提交、3 个文件、+104 / −13。Linux 会在
O_PATHfd 上设置FMODE_NONOTIFY,从而不产生 fsnotify 事件;Asterinas 原先会把它当作普通 fd,错误触发IN_OPEN/IN_CLOSE_NOWRITE。修复复用
FileLike::status_flags()判断O_PATH,在on_open/on_close中通过共享的notifiable_pathhelper 抑制通知。on_access/on_modify无需额外处理,因为O_PATH的空Rights会先使读写以EBADF失败。新增inotify_o_path回归测试,验证O_PATH打开没有事件、普通打开仍有事件。两位成员的公开 PR 与 Issue 台账
以下按 GitHub author 查询 asterinas/asterinas 的公开记录;“关联 Issue”不等同于该成员创建 Issue,表中只统计作者本人提交的 PR 与 Issue。
O_PATH与文件描述符 Linux 兼容性主线展开。ostd与int-to-c-enum的 README 嵌入 crate-level Rust 文档,消除重复维护;#3120 是本作品拆分出的兼容性修复。提交与 GitLink 同步说明
比赛要求包含作品展示视频、方案文档或 PPT 和源代码,并要求成果在 GitLink 平台开源。本仓库先作为 GitHub 协作与材料归档仓库;GitLink 同步由战队手动完成。
同步时请确认:
参考链接
O_PATHfsnotify 修复 PR #3117