早在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.
对于结构体,即使是指针,也把对应的内容以文本的形式输出了。