"%p"如何在bpf_trace_printk中实现?这似乎与printf非常不同。
#include <uapi/linux/ptrace.h>
int print_args(struct pt_regs *ctx) {
void *ptr = (void*)PT_REGS_PARM1(ctx);
bpf_trace_printk("args: %lx %p %ld\n", ptr, ptr, ptr);
return 0;
}我使用这个eBPF程序将参数跟踪到一个函数。参数的类型是指向某个结构的指针。
一个输出是:args: 7ffde047d6c4 00000000ec7e9023 140728366257860
我们可以注意到,"%p"的输出非常奇怪。如果我们使用标准C程序来检查输出:
#include <stdio.h>
int main() {
void *ptr = (void*)0x7ffde047d6c4;
printf("args: %lx %p %ld\n", ptr, ptr, ptr);
return 0;
}我们会得到:args: 7ffde047d6c4 0x7ffde047d6c4 140728366257860
发布于 2020-03-11 08:11:26
TL;DR..您看到的值是实际地址的散列,由ptr_to_id()计算。对地址进行散列以避免指针泄漏,同时仍然可以将此值用作唯一标识符。
解释。-- bpf_trace_printk助手的实现可以在内核源代码的kernel/trace/bpf_trace.c中找到。在调用__trace_printk()之前,大多数代码都是为了限制可以使用的说明符。您可以跟踪函数的轨迹到vsnprintf(),对于%p,它调用pointer()的默认行为是散列地址以避免指针泄漏。。
https://stackoverflow.com/questions/60629844
复制相似问题