【问题标题】:failing to attach eBPF `kretprobes` to `napi_poll()` with bcc tools无法使用密件抄送工具将 eBPF `kretprobes` 附加到 `napi_poll()`
【发布时间】:2018-06-06 09:46:56
【问题描述】:

想法是使用argdist 测量napi_poll() 的延迟持续时间,它返回处理的数据包数(称为工作)。 napi_poll() 的执行延迟与处理的数据包数量的比率将给出以直方图形式处理每个数据包所需的平均时间。

我正在使用以下命令

argdist -H 'r:c:napi_poll():u64:$latency/$retval#avg time per packet (ns)' 这最终给了我错误Failed to attach BPF to kprobe,在 dmesg 我收到类似Could not insert probe at napi_poll+0: -2的消息

我只是好奇为什么当类似的技巧适用于net_rx_action() 时我不能将kretprobes 附加到napi_poll()

【问题讨论】:

  • 您可以尝试使用更简单的工具吗?例如,funccount napi_poll。在我的系统上,napi_poll 不起作用,但 net_rx_action 起作用。可能只是因为一个是内联的而不是另一个。
  • 我认为你对函数的内联性是正确的,因为我尝试了其他所有方法,但 napi_poll 从未奏效。
  • 我会写一个完整的答案和建议,但不幸的是,如果你不能拦截这个函数,你就无能为力了。

标签: linux-kernel bpf ebpf bcc-bpf


【解决方案1】:

大多数情况下,Failed to attach BPF to kprobe 错误是由内联函数引起的。正如Kprobes documentationKprobes Features and Limitations 部分)中所解释的,如果目标函数被内联,Kprobes 将无法附加。由于napi_poll is static,它可能在编译时已被内联。

如果napi_poll 是否被内联,您可以检查内核符号:

$ cat /boot/System.map-`uname -r` | grep " napi_poll"
$
$ cat /boot/System.map-`uname -r` | grep " net_rx_action"
ffffffff817d8110 t net_rx_action

在我的系统上,napi_poll 是内联的,而 net_rx_action 不是。


根据您的目标,此问题有多种解决方法。

  1. 如果您不介意重新编译内核,可以使用Linux inline attribute 确保napi_poll 未内联。
  2. 如果您无法更改内核,通常的解决方法是找到提供相同信息的napi_poll 调用函数。 napi_poll 调用的函数如果提供足够的信息并且本身没有内联,也可以工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-27
    • 2014-10-06
    相关资源
    最近更新 更多