之前有新同事在问,strace的时候怎么样过滤掉某些系统调用, 这里简单总结下,希望对新同事有参考作用
部分跟踪举例:
1. 只跟踪epoll_wait和gettimeofday,其他系统调用通通过滤掉,可以这样: strace -e trace=epoll_wait,gettimeofday(逗号分隔)
2. 过滤epoll_wait和gettimeofday,其他系统调用通通跟踪,可以这样:strace -e trace=\!epoll_wait,gettimeofday(逗号分隔)
注意第2种情况在感叹号!前面有一个反斜线,防止被bash解释成自己的历史命令。
可以在常用的机器上定制自己的strace别名,方便使用,比方说我bashrc里面的:
alias syscall="strace -tt -T -s 200"
alias syscall2="sudo /usr/bin/strace -tt -T -s 200"
alias tracefd="strace -tt -T -s200 -etrace=send,recv,sendto,recvfrom,read,write,connect,socket,open,close"
alias tracefd2="sudo /usr/bin/strace -tt -T -s200 -etrace=send,recv,sendto,recvfrom,read,write,connect,socke
t,open,close"
调用次数、耗时统计:
strace -c
跟踪一段时间,然后CTRL^C终止查看结果。
跟踪子进程:
Strace –f –p $pid
其他常用选项
-p 跟踪一个具体的进程
-s 指定要跟踪的字符串的长度。
-tt –T 统计系统调用的开始结束时间,单次调用耗时
-o 将输出重定向到文件。有时候输出非常庞大,屏幕滚动过快,需要先重定位到文件而后查看。
或者使用2>outputfile, >前面之所以加2 是因为strace的输出在stderr而不是stdout。