Skip to content

feat(tracepoint): add sched_process_exec tracepoint #2149

Description

@sparkzky

背景

ANOLISA 的 agentsight 组件用 execve tracepoint 构建 AI agent 进程树——追踪进程创建事件,识别哪些进程是 AI agent(通过 /proc 扫描 + execve tracepoint 双通道)。这是 agentsight "AI Agent Auto-Discovery" 的核心依赖之一。

agentsight 的 eBPF 程序 bpf/proctrace.bpf.cbpf/procmon.bpf.c 依赖 Linux 的 sched_process_exec tracepoint 构建 process tree。

DragonOS 现状

DragonOS 的 tracepoint 框架成熟且全链路已通,但当前注册的 tracepoint 很少,且无 sched 类。

已有基础设施(可直接复用):

组件 文件 状态
tracepoint 定义宏 kernel/src/tracepoint/basic_macro.rs define_event_trace! 宏完整——声明 tracepoint、生成 trace_<name>() 调用函数、生成 register_trace/unregister_trace、生成 .tracepoint section 元数据
自动注册 kernel/src/tracepoint/mod.rs global_init_events() 启动时扫描 .tracepoint linker section,分配 ID,建 TracePointMapBTreeMap<u32, &TracePoint>)和 subsystem/event 层级树
static key 优化 kernel/src/tracepoint/point.rs TracePointStaticFalseKey——未启用时零开销快速路径
eBPF attach kernel/src/perf/tracepoint.rs perf_event_open_tracepoint() 按 tp_id 查找 tracepoint,set_bpf_prog() JIT 编译后注册为 raw_callback
ring buffer 输出 kernel/src/perf/bpf.rskernel/src/bpf/helper/mod.rs bpf_perf_event_output() helper → PerfEventArrayMapBpfPerfEvent::write_event() 写 mmap ring buffer

已注册的 tracepoint(共 10 个,无 sched 类)

  • fuse 子系统 8 个(kernel/src/filesystem/fuse/trace.rs
  • vfs 子系统 1 个:do_mkdir_atkernel/src/filesystem/vfs/vcore.rs
  • syscalls 子系统 1 个:sys_enter_openatkernel/src/filesystem/vfs/syscall/open_utils.rs

execve 无 tracepointkernel/src/process/execve.rsdo_execve_internal() 包含完整 ELF 加载、shebang 递归、地址空间切换、fd_table unshare 流程,但trace_ 调用

要做的事

步骤 1:声明 sched_process_exec tracepoint

新建 kernel/src/tracepoint/events/sched.rs(或在现有 sched trace 文件中添加):

define_event_trace!(
    sched_process_exec,
    TP_system("sched"),
    fields: {
        comm: [u8; 16],      // 进程名(16 字节)
        pid: i32,             // 当前 PID
        old_pid: i32,         // execve 前的 PID(线程组 leader 的 tgid)
    }
);

字段参考 Linux include/trace/events/sched.hsched_process_exec 定义。agentsight 至少需要 commpid

步骤 2:在 execve 中插入 trace 调用

kernel/src/process/execve.rsdo_execve_internal() 中,ELF 加载完成、新进程名已设置之后(返回成功之前),插入:

trace_sched_process_exec(&comm, pid, old_pid);

插入点选择:应在进程名已更新为新 ELF 的 comm、但控制权尚未返回用户态之前。这样 tracepoint 回调(eBPF 程序)能看到完整的进程信息。

步骤 3:注册到 debugfs 导出

确认 kernel/src/debug/tracing/events.rs 的 events 目录初始化会自动为新 subsystem sched 创建子目录、为新 event 创建 enable/format/id 文件。现有逻辑应自动处理,无需额外代码。

验证标准

  1. cat /sys/kernel/debug/tracing/events/sched/sched_process_exec/format 能看到事件格式
  2. 编写简单 eBPF 程序 attach 到该 tracepoint,执行一个 execve(如 ls),ring buffer 收到事件,commpid 正确
  3. agentsight 的 proctrace.bpf.c 在 DragonOS 上 attach 成功,能构建进程树

复杂度评估

小。约 50-100 行。

理由:宏、注册、eBPF attach、ring buffer 输出全链路已存在。唯一要写的是宏声明 + 一行 trace 调用。fuse 子系统的 8 个 tracepoint 已证明这套机制可用。

依赖关系

  • 无前置依赖——tracepoint 框架已就绪
  • 后续依赖:uprobe/uretprobe issue 的验证(agentsight 闭环)会用到进程树,但两者可并行开发

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions