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

能否用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的支持存在兼容性问题。

内容的提问来源于stack exchange,提问作者FauraSol

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 22:42:35