我想使用 SystemTap 编写简单的类似 strace 的脚本。主要目标是只捕获系统中所有进程的一些系统调用(如打开、关闭、读取、写入等)。(不能用 strace 做到这一点,因为 strace'ing 整个系统等于即时系统冻结)。
现在它是这样的:
#!/usr/bin/env stap
probe syscall.*
{
printf("PID: %d\tNAME: %s\tARGSTR: %s\n",pid(), name, argstr);
}
当我想将输出保存到文件时,问题就开始了。Stap 脚本不断发现自己正在写入文件,因此它永远不会结束循环。
我认为解决方案是这样的:
#!/usr/bin/env stap 探测系统调用。* { 如果(pid()!= myOwnPid()) printf("PID: %d\tNAME: %s\tARGSTR: %s\n",pid(), name, argstr); }
但我不知道任何提供运行 stap 脚本的 pid 的函数。
它将过滤自己的调用,用于
-o output
保存输出,就像使用strace
.要了解如何过滤一些 pid(xterm、X.org、ssh 等)以及如何仅指定一组 cpu、pid,将其与跟踪点、页面错误混合,从任何事件中获取调用链等。
如果您希望从 strace 中排除 systemtap 自己的用户空间
stapio
/staprun
进程,请使用stp_pid()
:另请参阅
man function::stp_pid
。