You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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工具获取结构体成员的内存偏移,直接通过偏移访问内存:

  1. 安装pahole工具:
sudo dnf install dwarves # CentOS/RHEL
# 或
sudo apt install dwarves # Debian/Ubuntu
  1. 获取各结构体成员的偏移值:
# 获取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
  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 11:37:42