微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何让 perf 脚本将字符串参数显示为系统调用作为文本,而不是指针值?

如何解决如何让 perf 脚本将字符串参数显示为系统调用作为文本,而不是指针值?

我正在尝试使用 perf 跟踪已删除文件。我知道 eBPF / SystemTap 更适合这里,但我在工具选择 (ARM) 的平台上受到限制。

我是这样录制的

perf record -e 'syscalls:sys_enter_unlinkat'

用于报告

perf script -F +pid,+tid,-cpu
rm 15746/15746  7942.646974: syscalls:sys_enter_unlinkat: dfd: 0xffffff9c,pathname: 0x55a7960e6490,flag: 0x00000000
rm 15748/15748  7944.626120: syscalls:sys_enter_unlinkat: dfd: 0xffffff9c,pathname: 0x55dea122f490,flag: 0x00000000
rm 15750/15750  7947.111921: syscalls:sys_enter_unlinkat: dfd: 0xffffff9c,pathname: 0x55a515165490,flag: 0x00000000

如何获得与 strace 输出类似的 pathname 字符串版本。 我还需要删除文件的进程的 uid。

解决方法

在这种情况下,将无法使用 pathname 工具获取 perf 的字符串版本。

当用户空间实用程序调用 perf_even_open 系统调用并请求监视跟踪点事件(例如您尝试使用 syscalls:sys_enter_unlinkat 监视的事件)时,“性能探测”功能会附加到跟踪点。可以看到探测函数here

probe 函数分配一个 perf buffervalidates 分配的缓冲区,然后调用 bpf 程序。

这个 bpf 程序需要知道静态跟踪点事件的“格式”,因为它需要了解 perf 环形缓冲区中二进制跟踪输出的结构。

事件的格式在 /sys/kernel/debug/tracing/events/syscalls/sys_enter_unlinkat/format 文件中定义,适用于您的情况。

如果您查看此文件,您将看到 perf script 根据字段中的 print fmt 条目报告输出。

name: sys_enter_unlinkat
ID: 722
format:
        field:unsigned short common_type;       offset:0;       size:2; signed:0;
        field:unsigned char common_flags;       offset:2;       size:1; signed:0;
        field:unsigned char common_preempt_count;       offset:3;       size:1; signed:0;
        field:int common_pid;   offset:4;       size:4; signed:1;

        field:int __syscall_nr; offset:8;       size:4; signed:1;
        field:int dfd;  offset:16;      size:8; signed:0;
        field:const char * pathname;    offset:24;      size:8; signed:0;
        field:int flag; offset:32;      size:8; signed:0;

print fmt: "dfd: 0x%08lx,pathname: 0x%08lx,flag: 0x%08lx",((unsigned long)(REC->dfd)),((unsigned long)(REC->pathname)),((unsigned long)(REC->flag))

perf 用户空间实用程序将始终遵循此格式,不会偏离此格式。您可以从 this 提交中看到一些详细信息。

如果不对内核跟踪点 API 进行真正广泛的修改,我看不到使用 perf 实现您想要的目标的方法。

如果您只想跟踪文件删除活动,并且想获得更多详细信息,我建议您尝试查看fanotify

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。