我可以使用 eBPF 来跟踪我自己的内核模块中定义的函数吗?

问题描述 投票:0回答:1

我尝试使用 eBPF 来跟踪我自己的内核模块中定义的函数,但出现错误。

libbpf: prog 'my_test_print': failed to find kernel BTF type ID of 'my_test_print': -3
libbpf: prog 'my_test_print': failed to prepare load attributes: -3
libbpf: prog 'my_test_print': failed to load: -3
libbpf: failed to load object 'ringbuffer_bpf'
libbpf: failed to load BPF skeleton 'ringbuffer_bpf': -3

我定义了名为

my_test_print
的函数并使用

EXPORT_SYMBOL(my_test_print);

暴露符号。我还检查了我的内核配置:

CONFIG_DEBUG_INFO_BTF=y
CONFIG_PAHOLE_HAS_SPLIT_BTF=y
CONFIG_DEBUG_INFO_BTF_MODULES=y

那么是否可以使用 eBPF 来跟踪我自己的内核模块中定义的函数?我怎样才能做到?

我发现this有类似的问题,但没有答案。

linux-kernel kernel ebpf
1个回答
0
投票

libbpf:prog'my_test_print':找不到'my_test_print'的内核BTF类型ID:-3

此错误在here抛出。当 this 函数返回错误时,就会发生这种情况。

查看

find_kernel_btf_id
中的逻辑,它期望模块中的任何符号都采用
<module-name>:<symbol>
的形式,并且任何没有模块名称作为前缀的符号都期望出现在vmlinux中。

因此您应该能够指定

SEC("fentry/my_module:my_test_print")
或任何等效项。

© www.soinside.com 2019 - 2024. All rights reserved.