SystemTap-过滤自己的系统调用(系统范围的跟踪)

SystemTap-过滤自己的系统调用(系统范围的跟踪)

我想使用 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/进程,请使用:staprunstp_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、将其与跟踪点、页面错误混合、从任何事件中获取调用链等。

相关内容