如何使用bpftool将eBPF程序附加到tracepoint?
使用bpftool将eBPF程序附加到Tracepoint的方法
前提条件
确保bpftool版本在v5.15+(部分旧版本功能不全),内核版本5.8+(支持BPF_LINK_CREATE系统调用)。
方法一:直接用bpftool prog attach(推荐,新版本支持)
如果你的bpftool是v6.0及以上版本,支持直接通过prog attach命令完成附加,无需手动处理perf事件:
- 加载eBPF程序到内核(可选,也可以直接指定.o文件):
bpftool prog load ./your_bpf_prog.o /sys/fs/bpf/loaded_prog - 附加到目标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程序的IDfd 10:perf事件的FD
5. 验证附加状态
bpftool link list
如果看到对应类型的link条目,说明附加成功。也可以通过cat /sys/kernel/debug/tracing/trace_pipe查看tracepoint触发时的eBPF输出。
内容的提问来源于stack exchange,提问作者metaphysicalmarty
相关产品推荐
相关产品推荐

