繁体   English   中英

为什么 bpf 程序找不到信息? 选择错误的kfunc?

[英]why bpf program doesn't find info? choose wrong kfunc?

我使用 kprobe/do_sys_open 来观察一些东西。 我写了一个演示来打开一个文件并阅读。 我想当我执行这个演示时,bpf 程序可以找到这些操作,但是从 bpf_trace_printk 中,我找不到关于我的演示的任何信息。 kernel function 是我选错了吗? 还是什么?

bpf_program.c

SEC("kprobe/do_sys_open")
int bpf_program(struct pt_regs *ctx)
{

    __u32 pid = bpf_get_current_pid_tgid() >> 32;
    char msg[16] = "";
    bpf_get_current_comm(msg, sizeof(msg)) ;
    // u32 uid = bpf_get_current_uid_gid();

    // const int dirfd = PT_REGS_PARM1(ctx);
    const char *pathname = (char *)PT_REGS_PARM2(ctx);
    char fmt[] = "@pid='%d' @pathname='%s' @ comm='%s'";

    bpf_trace_printk(fmt, sizeof(fmt), pid, pathname, msg);

    return 0 ;
}

打开文件.c

#include <stdio.h>
#include <unistd.h>

int main(void)
{
    FILE* fp ;
    char buff[255] ;

    printf("Pid %d\n", getpid()) ;

    fp = fopen("./test.c", "r") ;

    fscanf(fp, "%s", buff) ;

    printf("Read: [%s]\n", buff) ;

    getchar() ;

    fclose(fp) ;

    return 0 ;
}

您的演示中涉及的实际系统调用可能是openat() ,我会尝试挂钩kprobe/do_sys_openat2而不是kprobe/do_sys_open

例如,查看 BCC 中的opensnoop如何挂钩openopenat以捕获对两者的调用(使用系统调用跟踪点而不是 kprobes,但原理是相同的)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM