linux-kernel - 无法从 ebpf kprobe 正确读取争论
问题描述
我写了一个简单的 ebpf 程序(使用 libbpf),我在其中挂钩了sendto
syscall
libbpf 版本:
SEC("kprobe/sendto")
int BPF_KPROBE(entry_sendto, int sockfd, char* buf, size_t len)
{
bpf_printk("libbpf - entry_sendto - 0 %p", ctx);
bpf_printk("libbpf - entry_sendto - 1 %p", PT_REGS_PARM1(ctx));
bpf_printk("libbpf - entry_sendto - 2 %p", PT_REGS_PARM2(ctx));
bpf_printk("libbpf - entry_sendto - 3 %p", PT_REGS_PARM3(ctx));
bpf_printk("libbpf - entry_sendto - 1 %d", (int)PT_REGS_PARM1(ctx));
bpf_printk("libbpf - entry_sendto - 2 %s", (char *)PT_REGS_PARM2(ctx));
bpf_printk("libbpf - entry_sendto - 3 %d", (int)PT_REGS_PARM3(ctx));
bpf_printk("libbpf - entry_sendto params - 1 %d", sockfd);
bpf_printk("libbpf - entry_sendto params - 2 %s", buf);
bpf_printk("libbpf - entry_sendto params - 3 %d", len);
return 0;
}
密件抄送版本:
int syscall__probe_entry_sendto(struct pt_regs* ctx, int sockfd, char* buf, size_t len, int flags,
const struct sockaddr* dest_addr, size_t addrlen) {
bpf_trace_printk("bcc - entry_sendto - 0 %p", ctx);
bpf_trace_printk("bcc - entry_sendto - 1 %p", PT_REGS_PARM1(ctx));
bpf_trace_printk("bcc - entry_sendto - 2 %p", PT_REGS_PARM2(ctx));
bpf_trace_printk("bcc - entry_sendto - 3 %p", PT_REGS_PARM3(ctx));
bpf_trace_printk("bcc - entry_sendto - 1 %d", (int)PT_REGS_PARM1(ctx));
bpf_trace_printk("bcc - entry_sendto - 2 %s", (char *)PT_REGS_PARM2(ctx));
bpf_trace_printk("bcc - entry_sendto - 3 %d", (int)PT_REGS_PARM3(ctx));
bpf_trace_printk("bcc - entry_sendto params - 1 %d", sockfd);
bpf_trace_printk("bcc - entry_sendto params - 2 %s", buf);
bpf_trace_printk("bcc - entry_sendto params - 3 %d", len);
return 0;
}
我运行了一个简单的 curl 请求来检查钩子并得到以下信息:
curl-49713 [002] d... 15631.753730: bpf_trace_printk: libbpf - entry_sendto - 0 00000000eca092cd
curl-49713 [002] d... 15631.753731: bpf_trace_printk: libbpf - entry_sendto - 1 00000000bfcdc9b6
curl-49713 [002] d... 15631.753731: bpf_trace_printk: libbpf - entry_sendto - 2 0000000000000000
curl-49713 [002] d... 15631.753731: bpf_trace_printk: libbpf - entry_sendto - 3 ffffffffffffffff
curl-49713 [002] d... 15631.753732: bpf_trace_printk: libbpf - entry_sendto - 1 67403608
curl-49713 [002] d... 15631.753733: bpf_trace_printk: libbpf - entry_sendto - 2
curl-49713 [002] d... 15631.753734: bpf_trace_printk: libbpf - entry_sendto - 3 -1
curl-49713 [002] d... 15631.753735: bpf_trace_printk: libbpf - entry_sendto params - 1 67403608
curl-49713 [002] d... 15631.753736: bpf_trace_printk: libbpf - entry_sendto params - 2
curl-49713 [002] d... 15631.753736: bpf_trace_printk: libbpf - entry_sendto params - 3 -1
curl-49713 [002] d... 15631.753737: bpf_trace_printk: bcc - entry_sendto - 0 00000000eca092cd
curl-49713 [002] d... 15631.753737: bpf_trace_printk: bcc - entry_sendto - 1 00000000bfcdc9b6
curl-49713 [002] d... 15631.753738: bpf_trace_printk: bcc - entry_sendto - 2 0000000000000000
curl-49713 [002] d... 15631.753738: bpf_trace_printk: bcc - entry_sendto - 3 ffffffffffffffff
curl-49713 [002] d... 15631.753738: bpf_trace_printk: bcc - entry_sendto - 1 67403608
curl-49713 [002] d... 15631.753739: bpf_trace_printk: bcc - entry_sendto - 2
curl-49713 [002] d... 15631.753739: bpf_trace_printk: bcc - entry_sendto - 3 -1
curl-49713 [002] d... 15631.753740: bpf_trace_printk: bcc - entry_sendto params - 1 6
curl-49713 [002] d... 15631.753740: bpf_trace_printk: bcc - entry_sendto params - 2 8000
curl-49713 [002] d... 15631.753740: bpf_trace_printk: bcc - entry_sendto params - 3 1
我不明白我应该如何阅读sendto
libbpf 中 syscal 的参数。BCC 钩子和 libbpf 钩子之间的 ctx 结构是相同的(至少在地址方面)。
你看到我做错了什么吗?我错过了什么吗?任何帮助都感激不尽!
解决方案
推荐阅读
- javascript - Mongoosejs .find 返回整个模型而不是文档
- ruby-on-rails - 路径问题:错误资产管道中不存在资产“课程/python”?
- firebase - 我可以在 firestore 安全规则中执行 if else 语句来设置不同的操作吗?
- spring-boot - 运行 spring 测试时加载 ApplicationContext 失败
- c - 在内核模块中为 root 用户提供权限
- arrays - 唯一 ID 生成器和随机器
- javascript - 无法读取 PHP 文件返回的 Ajax 响应
- google-apps-script - 如何使用链接重新加载 Google Apps Script Web 应用程序?
- javascript - 具有多个参数或关键字的 JavaScript Filter() 函数
- spring-boot - 使用 Spring 批处理和 Oracle 10g 作为外部库得到此错误 org.springframework.transaction.CannotCreateTransactionException