[英]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
如何掛鈎open
和openat
以捕獲對兩者的調用(使用系統調用跟蹤點而不是 kprobes,但原理是相同的)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.