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