早在14年上半年实习的时候,就了解了strace并经常定位问题,但是一直没深入了解,现在深入的了解一下。

如果你直接strace一个进程,你会发现被输出刷屏了。

如果是性能问题,可以使用-c参数统计一下系统调用耗时。

如下图,统计一会按ctrl-c退出统计,可以看到各个系统调用的耗时。

看到一个系统调用比较耗时时,我们可以使用-e参数只看这个系统调用在干什么的。

上面展示系统调用了,但是没有显示时间。

写一个服务或者程序,系统调用异常了往往就是io操作,所以我们需要看看读与写的时间,来看看耗时是否合理。

如果我们的程序是多进程和多线程时,我们希望strace所有进程, 此时可以使用-f参数。

一般对于strace输出可以直接重定向到文件,但是这里也可以使用-o file参数把内容输出到文件,然后慢慢分析或者使用其他命令进一步分析。

是不是发现直接使用重定向没有得到内容, 这个说明strace的输出不是标准输出。

所以我们需要把标准错误输出也重定向到标准输出就行了。

有时候我们想直接在strace中看系统调用时传输的数据,比如文本形式的日志数据或者http数据。

但是我们又会发现输出的内容比较少,这个使用-s strsize参数可以调整输出的buf大小。

用户函数 ltrace

ltrace和strace就是个兄弟命令,用法几乎都一样。

是的,这个命令也可以查看系统调用,只需要加上-S参数。

默认输出的含义是每个系统调用的函数名,参数和返回值,并且输出是标准错误输出。

系统调用发生错误是通常是-1 然后errno被设置为对应的错误码。

所以strace的时候会显示错误码和错误信息。

对于信号,会输出信号符号和信号信息。

有时候系统调用需要花费一下时间,所以返回值和耗时是没办法统计到的。所以输出分两个阶段。

第一阶段会标识为unfinished 第二阶段会标识为resumed.

对于结构体,即使是指针,也把对应的内容以文本的形式输出了。