linux strace:如何过滤花费超过一秒钟的系统调用

时间:2016-07-26 17:24:45

标签: linux strace

我正在使用" strace -f -T -tt -o foo.txt -p 1234"打印系统调用所花费的时间。这使输出文件变得庞大,有没有办法只打印超过1秒的系统调用。我可以稍后从文件中删除它,但是有更好的方法吗?

2 个答案:

答案 0 :(得分:0)

如果我们只是省略-o foo.txt参数,则输出转到标准输出。我们可以通过grep管道并重定向到文件:

strace -f -T -tt  -p 1234 | grep pattern > foo.txt

同时观看输出:

strace -f -T -tt  -p 1234 | grep pattern | tee foo.txt

如果命令仅打印到作为参数传递的文件,并且我们想要过滤/重定向其输出,则第一步是检查它是否实现了破折号约定:是否可以使用{指定标准输入或输出{1}}作为文件名参数:

-

如果没有,那么求助于使用Bash流程替换替换语法:some_command - | our_pipe > file.txt >(output command)

<(input command)

进程替换语法扩展为适合作为命令或函数的文件名参数的标记。当程序打开该标记时,它会根据方向获取命令输入或输出的文件描述符。

通过进程替换,我们可以重定向顽固程序的输入或输出,这些程序仅对作为参数传递的文件起作用,并且不支持请求使用标准输入或输出代替文件的任何约定

进程替换使用的令牌与平台有关;我们可以看到使用some_command >(our_pipe > file.txt) 的内容。例如,在GNU / Linux上,Bash利用echo操作系统功能:

/dev/fd

答案 1 :(得分:0)

您可以使用以下命令:

strace -T command 2>&1 >/dev/null | awk '{gsub(/[<>]/,"",$NF)}$NF+.0>1.0'

说明:

  • strace -T<...>
  • 中添加了系统调用结束时所用的时间。
  • 2>&1 >/dev/null | awk将stderr传递给awk。 (strace将其输出写入stderr!)
  • awk命令从最后一个字段<>中删除$NF,并打印花费时间超过一秒的行。

您可能还希望将阈值作为变量传递给awk命令:

strace -T command 2>&1 >/dev/null \
  | awk -v thres=0.001 '{gsub(/[<>]/,"",$NF)}$NF+.0>thres+.0'