Linux 4.18内核下bpftrace程序运行失败求助
解决bpftrace无BTF环境下的头文件类型定义错误
可能的原因及解决方案
1. 补充完整头文件依赖
linux/path.h和dcache.h依赖其他基础内核头文件,直接包含会缺失类型定义。修改你的vfs_open.bt,添加前置依赖头文件:
/* FILENAME: vfs_open.bt */ #include <linux/types.h> #include <linux/sched.h> #include <linux/path.h> #include <linux/dcache.h> kprobe:vfs_open { struct path *path_ptr = (struct path *)arg0; printf("open path: %s\n", str(path_ptr->dentry->d_name.name)); }
运行时补充更多头文件目录(包含uapi相关路径):
sudo bpftrace -I /usr/src/kernels/4.18.0-348.7.1.el8_5.x86_64/include/ \ -I /usr/src/kernels/4.18.0-348.7.1.el8_5.x86_64/arch/x86/include/ \ -I /usr/src/kernels/4.18.0-348.7.1.el8_5.x86_64/include/uapi/ \ -I /usr/src/kernels/4.18.0-348.7.1.el8_5.x86_64/arch/x86/include/uapi/ \ vfs_open.bt
2. 使用结构体成员偏移量绕过头文件解析
如果头文件方式仍报错,可通过pahole工具获取结构体成员的内存偏移,直接通过偏移访问内存:
- 安装
pahole工具:
sudo dnf install dwarves # CentOS/RHEL # 或 sudo apt install dwarves # Debian/Ubuntu
- 获取各结构体成员的偏移值:
# 获取struct path中dentry的偏移 pahole -C struct path /usr/src/kernels/4.18.0-348.7.1.el8_5.x86_64/vmlinux # 获取struct dentry中d_name的偏移 pahole -C struct dentry /usr/src/kernels/4.18.0-348.7.1.el8_5.x86_64/vmlinux # 获取struct qstr中name的偏移(d_name属于qstr类型) pahole -C struct qstr /usr/src/kernels/4.18.0-348.7.1.el8_5.x86_64/vmlinux
- 修改bpftrace程序,用偏移替代结构体成员访问(示例偏移为0x0、0x50、0x0,需替换为实际获取的偏移):
kprobe:vfs_open { void *path = arg0; void *dentry = *(void **)(path + 0x0); void *d_name = (void *)(dentry + 0x50); char *name = *(char **)(d_name + 0x0); printf("open path: %s\n", str(name)); }
3. 确认内核头文件与运行版本一致
执行uname -r检查当前运行的内核版本,确保/usr/src/kernels下的头文件版本与之一致,避免因版本不匹配导致的结构体定义差异。
4. 升级bpftrace版本
旧版本bpftrace在无BTF环境下的头文件解析支持有限,尝试升级到最新稳定版:
# CentOS/RHEL可通过COPR仓库安装 sudo dnf copr enable bgregg/bpftrace sudo dnf install bpftrace
内容的提问来源于stack exchange,提问作者jiufei19
相关产品推荐
相关产品推荐

