如何判断eBPF程序属于tracepoint、raw_tracepoint、kprobe等类型?
判断eBPF程序类型的方法
从代码层面识别
- Tracepoint类型:
代码中会调用bpf_tracepoint()辅助函数,或在加载时指定具体tracepoint路径(如syscalls/sys_enter_openat)。同时会定义与目标tracepoint格式匹配的结构体,用于读取事件数据——比如你提供的sys_enter_openat格式,对应的eBPF代码会定义包含common_type、dfd、filename等字段的结构体。 - Raw Tracepoint类型:
使用bpf_raw_tracepoint()或bpf_raw_tracepoint_open()接口,无需匹配固定tracepoint格式,直接获取原始参数(通常为struct pt_regs*和void*)。 - Kprobe/Kretprobe类型:
通过bpf_kprobe()或bpf_kretprobe()挂钩内核函数,加载时指定目标内核函数名(如do_sys_openat),代码中依赖struct pt_regs获取函数参数或返回值。
查看已加载的eBPF程序类型
使用bpftool工具直接查看:
bpftool prog list
输出结果中每个程序的type字段会明确标注其类型(如tracepoint、raw_tracepoint、kprobe)。
结合你提供的tracepoint格式
你给出的是syscalls/sys_enter_openat的tracepoint格式,若某个eBPF程序基于该tracepoint开发,则它属于tracepoint类型。这类程序会严格按照该格式定义数据结构体,从而正确读取tracepoint事件的各项字段。
内容的提问来源于stack exchange,提问作者nexus
相关产品推荐
相关产品推荐

