Lea*_*iam 8 linux process system-calls tracing ftrace
我不确定我是否以正确的方式思考这个问题(如果我错了,请纠正我),但以下是我对 ftrace 的理解。
在/sys/kernel/debug/tracing中,有以下文件:
set_ftrace_filter
这只会跟踪里面列出的功能,
set_ftrace_notrace
这只会跟踪里面没有列出的功能,和
set_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 并决定是否使用该记录,但如果有办法避免它,我不希望为读取的每个记录添加此开销。
感谢您的时间!
我想出了如何做我所描述的,但这有点违反直觉,所以我在这里发布了答案,供搜索时可能会点击此页面的人使用(tl:dr;在底部)。 据我所知,没有一揽子方法可以轻松地从 ftrace 中过滤掉具有特定 PID 的进程,就像告诉它只考虑具有特定 PID 的进程一样,但在我的情况下,我只关心原始系统调用(sys_enter),我发现了如何消除包含某些 PID 的记录,这就是如何:
ftrace 目录为:
/系统/内核/调试/跟踪/
在里面,有一个名为“ events ”的目录。从这里,您可以看到 ftrace 可以跟踪的所有内容,但就我而言,我进入“ raw_syscalls ”。
在raw_syscalls 中,两个子目录是sys_enter和sys_exit。
在 sys_enter(和 sys_exit,就此而言)中,有以下文件:
使能够
筛选
格式
ID
扳机
“ filter ”是我们现在最关心的,但是format有关于在启用 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;
Run Code Online (Sandbox Code Playgroud)
在这里,我们关心的是common_pid。
如果您希望您的跟踪忽略来自 PID n进程的记录,您可以编辑
/sys/kernel/debug/tracing/events/raw_syscalls/sys_enter/filter
阅读:
common_pid != n
Run Code Online (Sandbox Code Playgroud)
如果您在跟踪时尝试忽略的程序有多个线程或多个进程,则只需使用 && 运算符。假设您想省略 PID 为n、o和p 的进程,您可以编辑该文件,使其显示为:
common_pid != n && common_pid != o && common_pid != p
Run Code Online (Sandbox Code Playgroud)
要清除过滤器,只需将“ 0 ”写入文件:
echo "0" > /sys/kernel/debug/tracing/events/raw_syscalls/sys_enter/filter
...会做的伎俩。
enable必须为您正在跟踪的事件以及ftrace 目录中的tracking_on包含“ 1 ” 。写入0会关闭对该事件的跟踪(或在tracking_on情况下的所有跟踪)。
写入这些文件需要 root 权限。
我能想到的大概就这些了。感谢任何阅读/投票的人,我希望我的回答对某人有所帮助。如果有人知道使我的做法看起来很愚蠢的方法,请随时给我打电话。
tl;dr:从进程 48 中过滤掉记录,写:
common_pid != 48
Run Code Online (Sandbox Code Playgroud)
...到
/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
Run Code Online (Sandbox Code Playgroud)
将“events/raw_syscalls/sys_enter”替换为您想要的事件,并将我的数字替换为您想要忽略的任何 PID。
| 归档时间: |
|
| 查看次数: |
3166 次 |
| 最近记录: |