AOSP 13中eBPF kprobe程序编译成功后无法自动加载问题咨询
AOSP 13下kprobe类型eBPF程序未自动加载的排查方案
关键排查步骤
确认加载配置文件
AOSP中eBPF程序的自动加载依赖/system/etc/bpf/progs.config,必须为你的kprobe程序添加对应条目,格式要和DEFINE_BPF_PROG参数匹配:kb_do_tcp_sendmsg kprobe/tcp_sendmsg 0 0格式说明:
[程序名称] [挂载点] [UID] [GID],这里的UID/GID对应你代码里的AID_ROOT(值为0)。验证内核完整支持
仅开启CONFIG_KPROBE=y不够,4.19内核还需要开启CONFIG_BPF_KPROBE_OVERRIDE才能支持kprobe类型的eBPF程序。可通过以下命令确认:zcat /proc/config.gz | grep CONFIG_BPF_KPROBE_OVERRIDE若输出为
CONFIG_BPF_KPROBE_OVERRIDE=y才符合要求,否则需要重新编译内核开启该选项。检查文件权限与SELinux上下文
- 确保
/system/etc/bpf/下的kprobe程序文件权限为root:root 0644,和正常运行的tracepoint程序权限一致。 - 检查SELinux上下文:执行
ls -Z /system/etc/bpf/,程序文件的上下文应为u:object_r:system_bpf_file:s0,若不符,执行restorecon -v /system/etc/bpf/kb_do_tcp_sendmsg修复。
- 确保
查看加载失败日志
重启设备后,通过以下命令提取eBPF相关日志,定位具体失败原因:logcat | grep -i bpf dmesg | grep -i bpf常见错误包括:kprobe挂载点不存在、程序字节码验证失败、权限不足等。
手动加载测试
使用bpftool手动加载程序,直接获取错误信息:bpftool prog load /system/etc/bpf/kb_do_tcp_sendmsg /sys/fs/bpf/kb_do_tcp_sendmsg type kprobe若手动加载失败,终端会返回明确的错误提示,比如内核不支持的指令、上下文类型不匹配等。
代码优化建议
你提供的代码片段中,void* ctx的定义存在风险:4.19内核中kprobe程序的上下文应为struct pt_regs*,虽然void*能编译,但可能导致内核验证程序时失败。建议修改为:
DEFINE_BPF_PROG("kprobe/tcp_sendmsg", AID_ROOT, AID_ROOT, kb_do_tcp_sendmsg) (struct pt_regs *ctx){ return 0; }
同时确保编译时使用AOSP官方提供的bpf工具链,避免因工具链版本差异导致的ELF格式问题。
内容的提问来源于stack exchange,提问作者王张军
相关产品推荐
相关产品推荐

