tracepoint / syscalls / sys_enter不会触发bpf_trace_printk

时间:2019-08-26 12:40:33

标签: c bpf ebpf tracepoint

目标:每次执行系统调用时打印Hello。

代码:

_kern.c

On Error Resume Next
colm = 0
colm = WorksheetFunction.Match("Order No", Sheets("Orders").Rows(1), 0)
If colm = 0 Then
    colm = WorksheetFunction.Match("Tilausnumero", Sheets("Orders").Rows(1), 0)
End If
If colm = 0 Then
    MsgBox "it's neither English nor Finnish"
    Exit Sub
End If
On Error GoTo 0

_user.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";

问题::当我运行该程序时,即使调用了开放系统调用,它也会终止而不显示“ Hello”。

问题:我缺少什么?我也尝试过sys_enter_open而不是sys_enter

1 个答案:

答案 0 :(得分:2)

对于其他程序类型,加载BPF程序需要两个步骤。首先是实际负载(您的情况下使用bpf_prog_load()执行的实际负载(将程序从用户空间注入程序,并通过验证程序)。然后,将程序附加到BPF钩子之一,这里是一个跟踪点。

在示例代码中,您的程序已加载,但尚未附加到跟踪点。例如,查看bpf_load.c如何使用libbpf到load a program,然后再使用attaches it到跟踪点。

我认为libbpf的最新版本现在提供bpf_program__attach_tracepoint()作为将程序附加到跟踪点的更简单方法。

如pchaigno所述,您可以使用sudo perf list tracepoint列出系统上可用的跟踪点(您可能必须安装perf实用程序)。