eBPF验证器报错:BTF类型ID未找到及kprobe挂载失败问题
解决《Learning eBPF》第7章hello.bpf.c的execve探针问题
针对你在Ubuntu 20.04(5.15.0-88-generic)环境下遇到的两个问题,给出具体解决方案:
1. 修复fentry探针的BTF类型ID错误
你的环境中内核未导出do_execve的BTF符号,原因是Ubuntu 5.15内核中,用户态execve系统调用的实际内核入口已变为__do_execve_file而非do_execve。
修改代码中的fentry探针定义:
// 原代码 SEC("fentry/do_execve") int BPF_PROG(fentry_do_execve, const char *filename, const char __user *const __user *argv, const char __user *const __user *envp) { // ... 原有逻辑 } // 修改为 SEC("fentry/__do_execve_file") int BPF_PROG(fentry_do_execve, struct file *file, const char __user *const __user *argv, const char __user *const __user *envp, int flags) { // ... 原有逻辑(可根据新参数调整输出) }
注意:__do_execve_file的参数签名与do_execve不同,需要同步调整函数参数列表。
2. 修复kprobe无法创建perf事件的问题
do_execve确实在当前内核中被内联优化,符号已不存在。同样需要将kprobe目标切换为__do_execve_file:
修改kprobe探针定义:
// 原代码 SEC("kprobe/do_execve") int BPF_KPROBE(kprobe_do_execve, const char *filename, const char __user *const __user *argv, const char __user *const __user *envp) { // ... 原有逻辑 } // 修改为 SEC("kprobe/__do_execve_file") int BPF_KPROBE(kprobe_do_execve, struct file *file, const char __user *const __user *argv, const char __user *const __user *envp, int flags) { // ... 原有逻辑(可根据新参数调整输出) }
验证步骤
确认内核符号存在:
cat /proc/kallsyms | grep __do_execve_file应有类似输出(地址可能不同):
ffffffffa02b3400 T __do_execve_file确认BTF符号存在:
bpftool btf dump file /sys/kernel/btf/vmlinux format raw | grep -i __do_execve_file用bpftrace测试探针可用性:
bpftrace -e 'kprobe:__do_execve_file { printf("execve triggered\n"); }'打开另一个终端执行
ls等命令,若能看到输出则说明探针可用。
额外检查
确保内核配置开启了必要选项:
zcat /proc/config.gz | grep -E "CONFIG_DEBUG_INFO_BTF|CONFIG_KPROBES|CONFIG_FENTRY"
输出应包含:
CONFIG_DEBUG_INFO_BTF=y CONFIG_KPROBES=y CONFIG_FENTRY=y
内容的提问来源于stack exchange,提问作者asr9
相关产品推荐
相关产品推荐

