tracepoint/syscalls/sys_enter 不触发 bpf_trace_printk
tracepoint/syscalls/sys_enter doesn't trigger bpf_trace_printk
GOAL:每次执行系统调用时打印Hello。
代码:
_kern.c
#include <linux/bpf.h>
#include "bpf_helpers.h"
SEC("tracepoint/syscalls/sys_enter")
int bpf_sys(struct syscalls_enter_open_args *ctx)
{
char fmt[] = "Hello\n";
bpf_trace_printk(fmt, sizeof(fmt));
return 0;
}
char _license[] SEC("license") = "GPL";
_user.c
#include <linux/bpf.h>
#include "libbpf.h"
#include <unistd.h>
#include <fcntl.h>
int main(int ac, char **argv)
{
int prog_fd, fd;
struct bpf_object *obj;
if (bpf_prog_load("tracesys_kern.o", BPF_PROG_TYPE_TRACEPOINT,
&obj, &prog_fd))
return 1;
fd = open("mine_user.c", O_RDONLY);
close(fd);
//fork();
return 0;
}
问题: 当我 运行 程序时它只是终止而不打印 "Hello" 如果调用 open 系统调用也是如此。
问题:我错过了什么?我也试过 sys_enter_open 而不是 sys_enter
至于其他程序类型,加载BPF程序需要两步。首先是实际负载(将程序从用户 space 注入内核 space,它通过验证程序),您在您的案例中使用 bpf_prog_load()
执行。然后,程序将附加到 BPF 挂钩之一,这里是跟踪点。
在您的示例代码中,您的程序已加载,但尚未附加到跟踪点。例如,查看 bpf_load.c
如何使用 libbpf load a program and then attaches it 跟踪点。
我认为最新版本的 libbpf 现在提供 bpf_program__attach_tracepoint()
作为将程序附加到跟踪点的更简单方法。
如 pchaigno 所述,您可以使用 sudo perf list tracepoint
列出系统上可用的跟踪点(您可能必须安装 perf
实用程序)。
GOAL:每次执行系统调用时打印Hello。
代码:
_kern.c
#include <linux/bpf.h>
#include "bpf_helpers.h"
SEC("tracepoint/syscalls/sys_enter")
int bpf_sys(struct syscalls_enter_open_args *ctx)
{
char fmt[] = "Hello\n";
bpf_trace_printk(fmt, sizeof(fmt));
return 0;
}
char _license[] SEC("license") = "GPL";
_user.c
#include <linux/bpf.h>
#include "libbpf.h"
#include <unistd.h>
#include <fcntl.h>
int main(int ac, char **argv)
{
int prog_fd, fd;
struct bpf_object *obj;
if (bpf_prog_load("tracesys_kern.o", BPF_PROG_TYPE_TRACEPOINT,
&obj, &prog_fd))
return 1;
fd = open("mine_user.c", O_RDONLY);
close(fd);
//fork();
return 0;
}
问题: 当我 运行 程序时它只是终止而不打印 "Hello" 如果调用 open 系统调用也是如此。
问题:我错过了什么?我也试过 sys_enter_open 而不是 sys_enter
至于其他程序类型,加载BPF程序需要两步。首先是实际负载(将程序从用户 space 注入内核 space,它通过验证程序),您在您的案例中使用 bpf_prog_load()
执行。然后,程序将附加到 BPF 挂钩之一,这里是跟踪点。
在您的示例代码中,您的程序已加载,但尚未附加到跟踪点。例如,查看 bpf_load.c
如何使用 libbpf load a program and then attaches it 跟踪点。
我认为最新版本的 libbpf 现在提供 bpf_program__attach_tracepoint()
作为将程序附加到跟踪点的更简单方法。
如 pchaigno 所述,您可以使用 sudo perf list tracepoint
列出系统上可用的跟踪点(您可能必须安装 perf
实用程序)。