strace

strace是一个非常简单的工具,它可以跟踪系统调用的执行。最简单的方式,它可以从头到尾跟踪binary的执行,然后以一行文本输出系统调用的名字,参数和返回值。

strace有两种运行模式。

  1. 一种是通过它启动要跟踪的进程。用法很简单,在原本的命令前加上strace即可。比如我们要跟踪 "ls -lh /var/log/messages" 这个命令的执行,可以这样:strace ls -lh /var/log/messages

  2. 另外一种运行模式,是跟踪已经在运行的进程,在不中断进程执行的情况下,理解它在干嘛。 这种情况,给strace传递个-p pid 选项即可。

参数

  • -p pid -- trace process with process id PID, may be repeated (要同时跟踪多个pid, 重复多次-p选项即可。
  • -c -- count time, calls, and errors for each syscall and report summary

strace -tt -T -v -f -e trace=file -o /data/log/strace.log -s 1024 -p 23489

  • -tt 在每行输出的前面,显示毫秒级别的时间
  • -T 显示每次系统调用所花费的时间
  • -v 对于某些相关调用,把完整的环境变量,文件stat结构等打出来。
  • -f 跟踪目标进程,以及目标进程创建的所有子进程
  • -o 把strace的输出单独写到指定的文件
  • -s 当系统调用的某个参数是字符串时,最多输出指定长度的内容,默认是32个字节

-e expr
指定一个表达式,用来控制如何跟踪.格式如下:
[qualifier=][!]value1[,value2]...
qualifier只能是 trace,abbrev,verbose,raw,signal,read,write其中之一.value是用来限定的符号或数字.默认的 qualifier是 trace.感叹号是否定符号.例如:
-eopen等价于 -e trace=open,表示只跟踪open调用.而-etrace!=open表示跟踪除了open以外的其他调用.有两个特殊的符号 all 和 none.
注意有些shell使用!来执行历史记录里的命令,所以要使用\.
-e trace=set
跟踪指定的系统 调用.例如:-e trace=open,close,rean,write表示只跟踪这四个系统调用.默认的为set=all.

-e trace=file
只跟踪有关文件操作的系统调用.

-e trace=process
只跟踪有关进程控制的系统调用.

-e trace=network
跟踪与网络有关的所有系统调用.

-e strace=signal
跟踪所有与系统信号有关的 系统调用

-e trace=ipc
跟踪所有与进程通讯有关的系统调用

-e abbrev=set
设定 strace输出的系统调用的结果集.-v 等与 abbrev=none.默认为abbrev=all.

-e raw=set
将指 定的系统调用的参数以十六进制显示.

-e signal=set
指定跟踪的系统信号.默认为all.如 signal=!SIGIO(或者signal=!io),表示不跟踪SIGIO信号.

-e read=set
输出从指定文件中读出 的数据.例如:
-e read=3,5
-e write=set
输出写入到指定文件中的数据.

当发现进程或服务异常时,我们可以通过strace来跟踪其系统调用,“看看它在干啥”,进而找到异常的原因。熟悉常用系统调用,能够更好地理解和使用strace。
当然,万能的strace也不是真正的万能。当目标进程卡死在用户态时,strace就没有输出了。
这个时候我们需要其他的跟踪手段,比如gdb/perf/SystemTap等。

参考

https://www.linuxidc.com/Linux/2018-01/150654.htm

posted @ 2020-02-19 13:10  friedCoder  阅读(145)  评论(0)    收藏  举报