在 ftrace 中过滤掉某些进程和/或 pid?

在 ftrace 中过滤掉某些进程和/或 pid?

我不确定我是否以正确的方式思考这个问题(如果我错了,请纠正我),但以下是我对 ftrace 的理解。

在/sys/kernel/debug/tracing中,有以下文件:

设置ftrace_filter

它只会跟踪里面列出的函数,

set_ftrace_notrace

它将仅跟踪未在其中列出的函数,并且

设置_ftrace_pid

它只会跟踪带有 pid 的进程。

我的问题是:有没有办法配置它,以便 ftrace 只跟踪没有特定 pid(或进程名称)的进程?

比喻:

set_ftrace_filter : set_ftrace_notrace :: set_ftrace_pid :X

X存在,如果存在,我该如何使用它?

例如,如果我想跟踪除 pid 48 之外的所有进程,是否有某种方法可以使某些内容有意义不是 48进入set_ftrace_pid?

我一直在阅读文档并搜索网络,但我找不到实现此目的的方法或这是否可能。

我为什么要这样做:我有一个正在跟踪内核级系统调用的程序,但我想将该程序的 pid(及其子进程的 pid,如果稍后需要的话)写入过滤器,以便它们不包含在跟踪数据中。读取跟踪时,我可以在读取每个跟踪记录时检查 pid,并决定是否使用该记录,但如果有办法避免的话,我不希望为读取的每个记录添加此开销。

感谢您的时间!

答案1

我想出了如何做我所描述的事情,但这有点违反直觉,所以我在这里为那些在搜索时可能会点击此页面的人发布答案(TL:博士;在底部)。 据我所知,没有一种全面的方法可以从 ftrace 中过滤掉具有特定 PID 的进程,就像告诉它只考虑具有特定 PID 的进程一样,但就我而言,我只关心原始系统调用 (sys_enter) 并且我找到了如何消除具有某些 PID 的记录,使其不被包含在内,具体方法如下:

ftrace 目录是:

/sys/内核/调试/跟踪/

里面有一个名为“事件” 从这里,您可以看到 ftrace 可以追踪的所有内容,但对于我的情况,我进入“原始系统调用”。

之内原始系统调用,”这两个子目录是系统输入系统退出

在 sys_enter(以及 sys_exit)内,有以下文件:

使能够

筛选

格式

ID

扳机

筛选“是我们现在最关心的,但是格式具有有关启用 sys_enter 时 ftrace 生成的条目字段的有用信息:

name: sys_enter
ID: 17
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:long id;  offset:8;   size:8; signed:1;
    field:unsigned long args[6];    offset:16;  size:48;    signed:0;

在这里,我们关心的是公共进程号

如果您希望跟踪忽略具有 PID 的进程中的记录n,你会编辑

/sys/kernel/debug/tracing/events/raw_syscalls/sys_enter/filter

读书:

common_pid != n

如果您在跟踪时尝试忽略的程序有多个线程或多个进程,则只需使用 && 运算符。假设您想省略带有 PID 的进程n,, 和p,您可以编辑该文件,使其内容如下:

common_pid != n && common_pid != o && common_pid != p

要清除过滤器,您只需编写“0”到文件:

回声“0”> /sys/kernel/debug/tracing/events/raw_syscalls/sys_enter/filter

...就可以了。

使能够必须包含“1“对于您正在追踪的事件以及追踪开启在 ftrace 目录中。写在0对该事件的跟踪(或在以下情况下的所有跟踪)追踪开启) 离开。

写入这些文件需要 root 权限。

我能想到的就这么多了。感谢任何阅读/投票的人,我希望我的回答对某人有所帮助。如果有人知道一种让我的做法看起来很愚蠢的方法,请随时给我打电话。

长话短说:要过滤掉进程 48 中的记录,请编写:

common_pid != 48

...到

/sys/kernel/debug/tracing/events/raw_syscalls/sys_enter/filter

通过编写以下内容来过滤多个 PID(例如 48、49、53、58):

common_pid != 48 && common_pid != 49 && common_pid != 53 && common_pid !=58

将“events/raw_syscalls/sys_enter”替换为您想要的事件,并将我的号码替换为您想要忽略的任何 PID。

相关内容