簡體   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