bpf_trace_printk 格式指针
bpf_trace_printk format pointer
"%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
TL;DR. 您看到的值是实际地址的哈希值,由 ptr_to_id()
计算得出。地址经过哈希处理以避免指针泄漏,同时仍然能够将此值用作唯一标识符。
说明。 bpf_trace_printk
助手的实现可以在 kernel/trace/bpf_trace.c
in the kernel sources. Most of the code is there to restrict what specifiers you can use, before calling __trace_printk()
. You can follow the trail of functions to vsnprintf()
which, for %p
, calls pointer()
whose default behavior is to hash the address to avoid pointer leaks.
中找到
"%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
TL;DR. 您看到的值是实际地址的哈希值,由 ptr_to_id()
计算得出。地址经过哈希处理以避免指针泄漏,同时仍然能够将此值用作唯一标识符。
说明。 bpf_trace_printk
助手的实现可以在 kernel/trace/bpf_trace.c
in the kernel sources. Most of the code is there to restrict what specifiers you can use, before calling __trace_printk()
. You can follow the trail of functions to vsnprintf()
which, for %p
, calls pointer()
whose default behavior is to hash the address to avoid pointer leaks.