bpftrace加载失败主因是内核BTF缺失或配置不全,需启用CONFIG_DEBUG_INFO_BTF=y等选项;可临时用--no-btf绕过,但功能受限;权限问题较少见,仍需检查debugfs、ptrace_scope和kptr_restrict。

这个问题通常不是权限不足,而是内核版本不匹配或缺失必要内核配置导致的。bpftrace 依赖 libbpf 加载 eBPF 程序,而 libbpf 在加载时会校验内核能力(如 BTF、特定 helper 函数、cgroup v2 支持等),一旦不满足就直接报 failed to load object,且错误信息非常模糊。
检查内核是否启用 BTF(最关键)
bpftrace 0.12+ 默认强制要求内核提供 BTF 信息(/sys/kernel/btf/vmlinux),否则无法生成和加载大部分程序。很多发行版默认不开启:
- Ubuntu/Debian:需安装
linux-image-extra-$(uname -r)或启用CONFIG_DEBUG_INFO_BTF=y并重新编译内核 - RHEL/CentOS 8+:需安装
kernel-debuginfo和kernel-debuginfo-common-$(uname -m),并确保/usr/lib/debug/lib/modules/$(uname -r)/vmlinux存在且可读 - Fedora:一般自带 BTF,但需确认
ls /sys/kernel/btf/vmlinux是否有输出
验证内核配置是否支持 bpftrace 常用功能
运行以下命令检查关键选项是否为 y 或 m:
zcat /proc/config.gz | grep -E "BPF|BTF|CGROUPS|DEBUG_INFO"(若无 /proc/config.gz,查 /boot/config-$(uname -r))
必须启用的配置包括:
CONFIG_BPF=yCONFIG_BPF_SYSCALL=y-
CONFIG_BPF_JIT=y(非必须但强烈建议) -
CONFIG_DEBUG_INFO_BTF=y(bpftrace 0.12+ 强依赖) -
CONFIG_CGROUPS=y(尤其使用 tracepoint/cgroup 脚本时)
绕过 BTF(仅临时调试用)
如果确认环境不支持 BTF,可用 --no-btf 启动(bpftrace ≥ 0.12):
bpftrace --no-btf -e 'kprobe:do_sys_open { printf("open: %s\n", str(args->filename)); }'
注意:--no-btf 模式下部分高级特性(如结构体字段访问、map 类型推导)不可用,且某些探针可能因缺少类型信息而失败。
权限问题其实很少是主因,但需排除
虽然错误提示容易让人怀疑权限,但真正卡在这里的情况较少。仍建议快速确认:
- 普通用户运行需确保
/sys/kernel/debug/tracing可写(通常由tracing_on权限控制,非 root 也可用) - 若用
uprobe或usdt,目标进程需有读取符号权限(ptrace_scope不能为 2) - 检查
cat /proc/sys/kernel/kptr_restrict,应为0或1(2会屏蔽内核符号,影响 kprobe 解析)










