用strace跟踪系统调用

之前有新同事在问,strace的时候怎么样过滤掉某些系统调用这里简单总结下,希望对新同事有参考作用

 

部分跟踪举例:

1.     只跟踪epoll_waitgettimeofday,其他系统调用通通过滤掉,可以这样: strace -e trace=epoll_wait,gettimeofday(逗号分隔)

2.     过滤epoll_waitgettimeofday,其他系统调用通通跟踪,可以这样: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 p $pid

 

其他常用选项

-p 跟踪一个具体的进程

-s  指定要跟踪的字符串的长度。

-tt 统计系统调用的开始结束时间,单次调用耗时

-o 将输出重定向到文件。有时候输出非常庞大,屏幕滚动过快,需要先重定位到文件而后查看。

   或者使用2>outputfile, >前面之所以加是因为strace的输出在stderr而不是stdout

 


你可能感兴趣的:(调试)