首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >bpf_trace_printk格式指针

bpf_trace_printk格式指针
EN

Stack Overflow用户
提问于 2020-03-11 05:38:52
回答 1查看 1.3K关注 0票数 5

"%p"如何在bpf_trace_printk中实现?这似乎与printf非常不同。

代码语言:javascript
复制
#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程序来检查输出:

代码语言:javascript
复制
#include <stdio.h>

int main() {
    void *ptr = (void*)0x7ffde047d6c4;
    printf("args: %lx %p %ld\n", ptr, ptr, ptr);
    return 0;
}

我们会得到:args: 7ffde047d6c4 0x7ffde047d6c4 140728366257860

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-11 08:11:26

TL;DR..您看到的值是实际地址的散列,由ptr_to_id()计算。对地址进行散列以避免指针泄漏,同时仍然可以将此值用作唯一标识符。

解释。-- bpf_trace_printk助手的实现可以在内核源代码的kernel/trace/bpf_trace.c中找到。在调用__trace_printk()之前,大多数代码都是为了限制可以使用的说明符。您可以跟踪函数的轨迹到vsnprintf(),对于%p,它调用pointer()默认行为是散列地址以避免指针泄漏。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60629844

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档