【问题标题】:How do I determine if the ebpf program is tracepoint, rawtracepoint, kprobe, etc?如何判断ebpf程序是tracepoint、rawtracepoint、kprobe等?
【发布时间】:2023-02-22 19:15:02
【问题描述】:

root@master:/sys/kernel/debug/tracing/events# cat 系统调用/sys_enter_openat/format
名称:sys_enter_openat
编号:651
格式:

字段:无符号短 common_type;偏移量:0;尺寸:2;签名:0;
字段:无符号字符 common_flags;偏移量:2;尺寸:1;签名:0;
字段:unsigned char common_preempt_count;偏移量:3;尺寸:1;签名:0;
字段:int common_pid;偏移量:4;尺寸:4;签名:1;
字段:int __syscall_nr;偏移量:8;尺寸:4;签名:1;
字段:int dfd;偏移量:16;尺寸:8;签名:0;
字段:const char * 文件名;偏移量:24;尺寸:8;签名:0;
字段:int 标志;偏移量:32;尺寸:8;签名:0;
字段:umode_t模式;偏移量:40;尺寸:8;签名:0;

print fmt: "dfd: 0x%08lx, 文件名: 0x%08lx, 标志: 0x%08lx, 模式: 0x%08lx", ((unsigned long)(REC->dfd)), ((unsigned long)(REC- >filename)), ((unsigned long)(REC->flags)), ((unsigned long)(REC->mode))

如何知道它是什么前卫类型?

【问题讨论】:

    标签: ebpf bpf


    【解决方案1】:

    您正在查看的是跟踪点的格式。它描述了将传递给潜在的BPF_PROG_TYPE_TRACEPOINT 程序的上下文结构,如果您要将其附加到此跟踪点。跟踪点程序只能附加到内核中这些预定义的跟踪点。

    BPF_PROG_TYPE_RAW_TRACEPOINT 程序也可以附加到这些相同的跟踪点,但您不会获得格式化的上下文,而只会获得表示参数的 64 位值数组。所以你可能需要做一些额外的工作来解析它们。

    struct bpf_raw_tracepoint_args {
           __u64 args[0];
    };
    

    BPF_PROG_TYPE_KPROBE 程序几乎可以附加到内核中的任何函数。例外是明确禁止的位置。但是其他因素,如函数的内联,也会使 kprobe 某些事情变得困难。与原始跟踪点一样,您不会在这里获得任何类型信息,只有原始寄存器值和在合理范围内读取内核内存的能力。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-18
      • 2019-01-27
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 2022-11-18
      • 2010-11-28
      • 1970-01-01
      相关资源
      最近更新 更多