我不确定我是否以正确的方式思考这个问题(如果我错了,请纠正我),但以下是我对 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。