能否用eBPF追踪自定义内核模块函数?求助解决报错
可以用eBPF追踪自定义内核模块的函数,以下是解决当前报错的步骤
核心原因
报错本质是libbpf无法从内核BTF中找到my_test_print的元数据,即便导出了函数符号,BTF信息缺失或未加载都会触发该问题。
具体解决步骤
确保模块编译时生成BTF
编译自定义模块的Makefile需显式开启BTF生成,在编译命令后追加BTF=1:obj-m += my_module.o all: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules BTF=1 clean: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean编译完成后,用
llvm-objdump --show-section=.__BTF my_module.ko验证模块是否包含BTF段,无输出则重新编译。确认模块加载后BTF已被内核识别
模块加载后,检查/sys/kernel/btf/下是否存在对应模块的BTF文件:ls /sys/kernel/btf/my_module若存在,用
bpftool btf dump file /sys/kernel/btf/my_module | grep my_test_print确认函数元数据存在;若不存在,尝试手动加载BTF:bpftool btf load my_module.ko /sys/kernel/btf/my_module验证函数符号导出状态
模块加载后,查看/proc/kallsyms确认函数已导出:cat /proc/kallsyms | grep my_test_print输出中函数名前应为大写字母(小写表示未导出),若为小写,检查
EXPORT_SYMBOL(my_test_print)是否放在函数定义之后,或函数名是否拼写错误。检查eBPF程序的函数引用
确保BPF代码中追踪的函数名与模块定义完全一致(区分大小写),比如使用kprobe/my_test_print或fentry/my_test_print时,名字不能有误。若用fentry/fexit,需内核版本≥5.5。排查工具与内核版本
- 确保pahole版本≥1.16,旧版本可能生成无效BTF,可通过
pahole --version检查并更新。 - 尽量使用5.10及以上LTS内核,旧内核对模块BTF的支持存在兼容性问题。
- 确保pahole版本≥1.16,旧版本可能生成无效BTF,可通过
内容的提问来源于stack exchange,提问作者FauraSol
相关产品推荐
相关产品推荐

