我想使用 SystemTap 编写简单的类似 strace 的脚本。主要目标是仅捕获系统中所有进程的一些系统调用(如打开、关闭、读取、写入等)。(无法使用 strace 执行此操作,因为对整个系统进行 strace 相当于立即冻结系统)。
目前情况如下:
#!/usr/bin/env stap
probe syscall.*
{
printf("PID: %d\tNAME: %s\tARGSTR: %s\n",pid(), name, argstr);
}
当我想将输出保存到文件时,问题就开始了。Stap 脚本不断发现自己正在写入文件,因此它永无止境地循环。
我认为解决方案可能是这样的:
#!/usr/bin/env 命令 探测系统调用。* { 如果 (pid() != myOwnPid()) printf("PID: %d\tNAME: %s\tARGSTR: %s\n",pid(), name, argstr); }
但我不知道有任何函数提供正在运行的 stap 脚本的 pid。
答案1
如果你希望从 strace 中排除 systemtap 自己的用户空间stapio
/进程,请使用:staprun
stp_pid()
if (pid() != stp_pid())
printf("...")
也可以看看man function::stp_pid
。
答案2
perf trace -a -e open,close,read,write
它将过滤自己的调用,用来-o output
保存输出,就像 一样strace
。
perf trace -h
了解如何过滤某些 pid(xterm、X.org、ssh 等)以及如何指定一组 cpu、pid、将其与跟踪点、页面错误混合、从任何事件中获取调用链等。