You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用bpftool将eBPF程序附加到tracepoint?

使用bpftool将eBPF程序附加到Tracepoint的方法

前提条件

确保bpftool版本在v5.15+(部分旧版本功能不全),内核版本5.8+(支持BPF_LINK_CREATE系统调用)。


方法一:直接用bpftool prog attach(推荐,新版本支持)

如果你的bpftool是v6.0及以上版本,支持直接通过prog attach命令完成附加,无需手动处理perf事件:

  1. 加载eBPF程序到内核(可选,也可以直接指定.o文件):
    bpftool prog load ./your_bpf_prog.o /sys/fs/bpf/loaded_prog
    
  2. 附加到目标tracepoint:
    # 方式1:直接用.o文件
    bpftool prog attach ./your_bpf_prog.o tracepoint:<category>:<event>
    # 方式2:用已加载程序的ID/名称
    bpftool prog attach id 123 tracepoint:sched:sched_process_exec
    
    替换<category>:<event>为你要跟踪的tracepoint,比如sched:sched_process_exec。

方法二:手动创建perf事件+BPF Link(兼容旧版本bpftool)

如果你的bpftool版本不支持prog attach tracepoint,可通过以下步骤模拟libbpf的附加逻辑:

1. 加载eBPF程序并获取程序ID

bpftool prog load ./your_bpf_prog.o /sys/fs/bpf/loaded_prog
# 查看程序ID
bpftool prog list | grep your_bpf_prog

记下来程序ID(比如123)。

2. 获取目标tracepoint的ID

# 替换为你的tracepoint路径
cat /sys/kernel/debug/tracing/events/sched/sched_process_exec/id

得到tracepoint ID(比如42)。

3. 创建perf事件并保留FD

编写一个简单的C程序create_perf_event.c来调用perf_event_open:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/syscall.h>
#include <linux/perf_event.h>

int main(int argc, char **argv) {
    struct perf_event_attr attr = {0};
    int tp_id = atoi(argv[1]);

    attr.type = PERF_TYPE_TRACEPOINT;
    attr.config = tp_id;
    attr.size = sizeof(attr);
    attr.sample_type = PERF_SAMPLE_RAW;
    attr.sample_period = 1;
    attr.wakeup_events = 1;

    int fd = syscall(__NR_perf_event_open, &attr, -1, 0, -1, 0);
    if (fd < 0) { perror("perf_event_open failed"); exit(1); }
    printf("%d\n", fd);
    pause(); // 保持进程运行,避免FD被回收
    return 0;
}

编译并运行,得到perf事件的FD:

gcc create_perf_event.c -o create_perf_event
./create_perf_event 42 &  # 传入之前拿到的tracepoint ID

输出的数字就是perf事件FD(比如10)。

4. 创建BPF Link完成附加

bpftool link create type perf_event prog 123 fd 10
  • type perf_event:指定link类型为perf事件
  • prog 123:eBPF程序的ID
  • fd 10:perf事件的FD

5. 验证附加状态

bpftool link list

如果看到对应类型的link条目,说明附加成功。也可以通过cat /sys/kernel/debug/tracing/trace_pipe查看tracepoint触发时的eBPF输出。


内容的提问来源于stack exchange,提问作者metaphysicalmarty

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 05:02:55