试图学习eBPF尾部调用,无法附加kprobe

时间:2019-06-30 21:57:55

标签: linux ebpf

嗨,我正在尝试学习如何使用eBPF映射,因此我尝试运行在BCC文档中找到的简单代码。

import os
import socket
import time
import logging
import signal
import sys
import zmq
import json
import yaml
import netifaces as ni
from bcc import BPF
from ctypes import *

b = BPF(src_file="tailcall_test.c")
tail_fn = b.load_func("tail_call", BPF.KPROBE)
prog_array = b.get_table("prog_array")
prog_array[c_int(2)] = c_int(tail_fn.fd)
b.attach_kprobe(event="some_kprobe_event", fn_name = "do_tail_call")

这是我使用的c代码,名称为:tailcall_test.c:

#include <uapi/linux/ptrace.h>
#include <net/sock.h>
#include <bcc/proto.h>
#include <linux/bpf.h>
#include <linux/kernel.h>
#include <uapi/linux/bpf.h>

BPF_PROG_ARRAY(prog_array, 10);

int tail_call(void *ctx) {
        bpf_trace_printk("tail-call\n");
        return 0;
}

int do_tail_call(void *ctx) {
        bpf_trace_printk("Original program\n");
        prog_array.call(ctx, 2);
        return 0;
}

我不确定是否需要包含哪些标头或库,因此我将所有内容都转储到了那里。.对脏代码:(

无论如何,当我尝试运行它时,它会给我这个错误:

cannot attach kprobe, probe entry may not exist
Traceback (most recent call last):
  File "tailcall_test.py", line 18, in <module>
    b.attach_kprobe(event="some_kprobe_event", fn_name = "do_tail_call")
  File "/usr/lib/python2.7/dist-packages/bcc/__init__.py", line 648, in attach_kprobe
    (fn_name, event))
Exception: Failed to attach BPF program do_tail_call to kprobe some_kprobe_event

有帮助吗?? 提前非常感谢您。

此外,如果您有任何建议可以检查以学习如何使用eBPF尾部呼叫,那么如果您能与我分享它们,我将非常感谢。

非常感谢。

1 个答案:

答案 0 :(得分:1)

因此,在Roadowl在评论中找到问题的原因之前,我没有时间完成我的答案的输入:)。由于问题的第二部分涉及到有关尾部调用的引用,并且无论如何我都写了这一点,因此我将其发布以防万一。

  • 仅供参考,密件抄送文档中有a paragraph on tail calls,但是从您的代码看来,您已经找到了它:)。

  • 如果您想了解尾部调用的工作原理,建议您阅读Cilium的文档,尤其是the section on tail calls。请记住,密件抄送提供了一些包装器(例如.call()函数),这些包装器不会在Cilium的文档中介绍,但无论如何它应该可以帮助您了解幕后发生的事情。

  • 密件抄送本身似乎并没有使用太多的尾部调用,我只能找到似乎正在使用尾部调用的one networking example(尽管我没有彻底搜索)。

  • 您可以在iproute2存储库(simple oneone that loops)中使用尾部调用找到一些简单的示例程序。您还可以在内核samplesselftests中找到一些:tail_call的grep。