尝试学习 eBPF 尾调用,无法附加 kprobe
Tried to learn eBPF tail call, fails to attach kprobe
你好,我正在尝试学习如何使用 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 尾调用,如果你们愿意与我分享,我将不胜感激。
非常感谢。
因此,在 Roadowl 在评论中找到问题的原因之前,我没有时间完成输入我的答案:)。由于关于尾调用引用的问题中有第二部分,而且我已经写了那部分,所以我 post 以防万一它会有所帮助。
仅供将来参考,bcc 文档中有 a paragraph on tail calls,但通过查看您的代码,您已经找到了它:)。
如果您想了解尾调用的工作原理,我建议您查看 Cilium 的文档,尤其是 the section on tail calls。请记住,bcc 提供了一些不会在 Cilium 的文档中涵盖的包装器(例如 .call()
函数),但它应该可以帮助您了解幕后发生的事情。
bcc 本身用尾调用的好像不多,我只能找到好像用的one networking example(虽然没搜透)
您可以在 iproute2 存储库中找到一些使用尾调用的简单示例程序(一个 simple one, one that loops). You can also find some in kernel samples or selftests: grep for tail_call
.
你好,我正在尝试学习如何使用 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 尾调用,如果你们愿意与我分享,我将不胜感激。
非常感谢。
因此,在 Roadowl 在评论中找到问题的原因之前,我没有时间完成输入我的答案:)。由于关于尾调用引用的问题中有第二部分,而且我已经写了那部分,所以我 post 以防万一它会有所帮助。
仅供将来参考,bcc 文档中有 a paragraph on tail calls,但通过查看您的代码,您已经找到了它:)。
如果您想了解尾调用的工作原理,我建议您查看 Cilium 的文档,尤其是 the section on tail calls。请记住,bcc 提供了一些不会在 Cilium 的文档中涵盖的包装器(例如
.call()
函数),但它应该可以帮助您了解幕后发生的事情。bcc 本身用尾调用的好像不多,我只能找到好像用的one networking example(虽然没搜透)
您可以在 iproute2 存储库中找到一些使用尾调用的简单示例程序(一个 simple one, one that loops). You can also find some in kernel samples or selftests: grep for
tail_call
.