我正在尝试从 BPF CO:RE 开发开始。在虚拟机中使用 Ubuntu 20.04 LTS,我需要重新编译内核并安装 pahole(来自 apt install dwarves),以便启用 BTF(我设置 CONFIG_DEBUG_FS=y 和 CONFIG_DEBUG_INFO_BTF=y)。
所以我的设置是:
/sys/kernel/btf/vmlinux 存在,可以用 cat 读出。
但 bpftool 显示以下错误:
$ sudo bpftool btf dump file /sys/kernel/btf/vmlinux format c
libbpf: failed to get EHDR from /sys/kernel/btf/vmlinux
Error: failed to load BTF from /sys/kernel/btf/vmlinux: Unknown error -4001
Run Code Online (Sandbox Code Playgroud)
从https://github.com/libbpf/libbpf/blob/master/src/libbpf.h 看来它是LIBBPF_ERRNO__FORMAT, /* BPF 对象格式无效 */ 但我无法找出问题所在。
有谁知道错误可能出在哪里?
提前致谢!
编辑:添加了 bpftool 版本
我正在进入 eBPF 编程并想要使用原始跟踪点,但我不太明白如何使用它们以及如何正确访问参数。我将不胜感激任何对文档的帮助和提示。
我的问题:
uint16_t common_type;顺便说一句:原始跟踪点是什么?系统:Ubuntu 2004,内核 5.4 通用,x86_64
解释/示例:
我从“正常跟踪点”开始sys_enter_kill,我可以在其中使用以下参数创建结构sudo cat /sys/kernel/debug/tracing/events/syscalls/sys_enter_kill/format:
// sudo cat /sys/kernel/debug/tracing/events/syscalls/sys_enter_kill/format
// name: sys_enter_kill
// ID: 184
// format:
// field:unsigned short common_type; offset:0; size:2; signed:0;
// field:unsigned char common_flags; offset:2; size:1; signed:0;
// field:unsigned char common_preempt_count; offset:3; size:1;signed:0;
// field:int common_pid; offset:4; size:4; signed:1;
// field:int __syscall_nr; offset:8; size:4; signed:1;
// field:pid_t pid; offset:16; size:8; signed:0;
// field:int sig; offset:24; size:8; signed:0;
struct syscalls_enter_kill_args …Run Code Online (Sandbox Code Playgroud)