5

如何使用 Berkeley Packet Filter (BPF) 过滤内核中的函数参数?该函数应该是任何非内联函数,而不仅仅是系统调用。此外,最好可以取消引用函数参数中的指针以进行验证。

我搜索了互联网,但找不到任何用例。大部分资料只描述了如何使用 seccomp / seccomp-BPF。

似乎集成了 eBPF 和 kprobe/jprobe 来实现挂钩。但我在网上找不到一个很好的例子。

4

1 回答 1

3

eBPF可能是你想要的。如果您还没有找到它们,您应该查看bcc(BPF 编译器集合)工具提供的示例。

特别是,示例工具argdist确实依赖于 kprobes,您可能会感兴趣:

argdist 探测您指定的函数并将参数值收集到直方图或频率计数中。这可用于了解某个参数取值的分布、过滤和打印感兴趣的参数而无需附加调试器,以及获取各种函数的一般执行统计信息。

例如,假设您想查找应用程序中常见的分配大小:

# ./argdist -p 2420 -C 'p:c:malloc(size_t size):size_t:size'
[01:42:29]
p:c:malloc(size_t size):size_t:size
       COUNT      EVENT
[01:42:30]
p:c:malloc(size_t size):size_t:size
COUNT EVENT

[…]

(从argdist 示例中提取使用)。

作为记录,到目前为止,我发现的大多数 eBPF 示例都位于以下位置之一:

  • linux/samples/bpfLinux内核源代码下。
  • bcc/tools密件抄送的目录中。
  • (对于涉及的网络示例tc,在iproute2/examples/tciproute2 包源中的目录下。)
于 2016-08-27T16:41:30.950 回答