嗨,我正在尝试学习如何使用 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 尾调用,如果你们能与我分享,我将不胜感激。
提前非常感谢。