例如,要监控所有mkdir
拨打的电话,我能想到的最好办法是:
#!/bin/sh
set -eux
d=debug/tracing
mkdir -p debug
if ! mountpoint -q debug; then
mount -t debugfs nodev debug
fi
# Stop tracing.
echo 0 > "${d}/tracing_on"
# Clear previous traces.
echo > "${d}/trace"
# Enable tracing mkdir
echo sys_enter_mkdir > "${d}/set_event"
# Set tracer type.
echo function > "${d}/current_tracer"
# Filter only sys_mkdir as a workaround.
echo SyS_mkdir > "${d}/set_ftrace_filter"
# Start tracing.
echo 1 > "${d}/tracing_on"
# Generate two mkdir calls.
rm -rf /tmp/a
rm -rf /tmp/b
mkdir /tmp/a
mkdir /tmp/b
# View the trace.
cat "${d}/trace"
# Stop tracing.
echo 0 > "${d}/tracing_on"
umount debug
然后在运行后sudo
给出:
# tracer: function
#
# entries-in-buffer/entries-written: 4/4 #P:16
#
# _-----=> irqs-off
# / _----=> need-resched
# | / _---=> hardirq/softirq
# || / _--=> preempt-depth
# ||| / delay
# TASK-PID CPU# |||| TIMESTAMP FUNCTION
# | | | |||| | |
mkdir-31254 [015] .... 2010985.576760: sys_mkdir(pathname: 7ffc54b32c77, mode: 1ff)
mkdir-31254 [015] .... 2010985.576763: SyS_mkdir <-tracesys_phase2
mkdir-31255 [007] .... 2010985.578363: sys_mkdir(pathname: 7fff02d90c77, mode: 1ff)
mkdir-31255 [007] .... 2010985.578365: SyS_mkdir <-tracesys_phase2
我的问题是它为每个系统调用输出两行:
sys_mkdir
这是我想要的事件SyS_mkdir
这是过滤功能解决方法,我不想看到
如果我改为尝试这样做:
echo > "${d}/set_ftrace_filter"
或者根本不碰那个文件,然后它会显示大量的功能,并且很难找到系统调用。
如果有更好的方法来禁用常规功能,只保留系统调用事件?
我可以只使用SyS_mkdir
并禁用我猜想的系统调用事件,但如果我可以使用更具体的事件会感觉更干净吗?还:
- 该事件显示参数,这更好。
- 系统调用函数名称随内核版本而变化。例如,它已经
__x64_sys_mkdir
代替了SyS_mkdir
Linux v4.18。
有关的:
在 Ubuntu 18.04、Linux 内核 4.15 上测试。