#definePT_REGS_PARM3(x) ((x)->dx) #definePT_REGS_PARM4(x) ((x)->cx) #definePT_REGS_PARM5(x) ((x)->r8) 可以看到,上述的宏只能获取 5 个参数;但是在最近的一个项目中,就遇到了如何获取超过 5 个参数的难题,这也是本文的由来,如果你也有类似的困惑,本文也许是为你准备的。 如何获取插桩...
//int trace_udp_sendmsg(struct pt_regs *ctx) { // struct sock *sk = (struct sock *)PT_REGS_PARM1(ctx); int trace_udp_sendmsg(struct pt_regs *ctx, struct sock *sk) { u16 sport = sk->sk_num; u16 dport = sk->sk_dport; // Processing packets only on port 53. // 13568 =...
typeof(user_probe2(0)) user_probe2(struct pt_regs *ctx) { return ___user_probe2(ctx, (unsigned long long int)PT_REGS_PARM1(ctx), (unsigned long long int)PT_REGS_PARM2(ctx)); } 这是user_probe2函数的定义。它使用PT_REGS_PARM1(ctx)和PT_REGS_PARM2(ctx)宏来获取用户空间探针传递...
returnPT_REGS_PARM1_CORE(regs); case1: returnPT_REGS_PARM2_CORE(regs); case2: returnPT_REGS_PARM3_CORE(regs); case3: returnPT_REGS_PARM4_CORE(regs); case4: returnPT_REGS_PARM5_CORE(regs); case5: returnPT_REGS_PARM6_CORE(regs); default: #ifdef__TARGET_ARCH_arm64 if(n < NR...
(void *)ctx->bp; data.a = PT_REGS_PARM1(ctx); data.b = PT_REGS_PARM2(ctx); bpf_probe_read(&data.uninit_c, sizeof(data.uninit_c), bp - 4); bpf_probe_write_user(bp - 4, &c, 4); bpf_probe_read(&data.c, sizeof(data.c), bp - 4); events.perf_submit(ctx, &data...
在kfunc,可以通过PT_REGS_PARM*来获取目标函数的第 *th 个参数, 见图 3.1.8。 图3.1.8 用 PT_REGS_PARM1 获取open()的第一个参数 kprobe部分(在目标函数执行前的hook代码段), 见图 3.1.9: 图3.1.9 kprobe 通过调用bpf_get_current_pid_tgid获取tid,然后右移32位获取 pid 。
它使用PT_REGS_PARM1(ctx)和PT_REGS_PARM2(ctx)宏来获取用户空间探针传递给eBPF程序的前两个参数。 如果对于以上的代码解读如果还有不明白的地方,可以尝试问问GPT。 作者:闻茂泉 原文链接 本文为阿里云原创内容,未经允许不得转载。
int kprobe_vfs_write(struct pt_regs *regs) { struct file *file file = (struct file *)PT_REGS_PARM1(regs); // ... } 其中pt_regs 的结构体如下: struct pt_regs { /* * C ABI says these regs are callee-preserved. They aren't saved on kernel entry ...
程序本身名字使用宏PT_REGS_PARM1,第一个参数使用宏PT_REGS_PARM2。 1.5uretprobes 同uprobes,只不过该探针是在函数返回时候触发。 返回的值通过PT_REGS_RC(ctx)获取,例如: BPF_HISTOGRAM(dist);intcount(structpt_regs *ctx) { dist.increment(PT_REGS_RC(ctx));return0; ...
1、设计和实现watcher程序,负责监听程序的运行和终止 这个watcher的程序设计主要是针对第一和第二两个问题 strace -o test.data mysqld 1. 查看mysqld启动调用过程: execve("/usr/sbin/mysqld", ["mysqld"], 0x7ffc619fbdf0 /* 58 vars */) = 0 ...