一、命令介绍
strace 常用来跟踪进程执行时的系统调用和所接收的信号。在Linux 世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式,通过系统调用访问硬件设备。strace 可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。
二、参数说明
- -p:跟踪指定的进程。
- -f:跟踪由fork 子进程系统调用。
- -F:尝试跟踪vfork 子进程系统调吸入,与-f 同时出现时, vfork 不被跟踪。
- -o filename:默认strace 将结果输出到stdout。通过-o 可以将输出写入到filename 文件中。
- -ff:常与-o 选项一起使用,不同进程(子进程)产生的系统调用输出到filename.PID 文件。
- -r:打印每一个系统调用的相对时间。
- -t:在输出中的每一行前加上时间信息。-tt 时间确定到微秒级。还可以使用-ttt 打印相对时间。
- -v:输出所有系统调用。默认情况下,一些频繁调用的系统调用不会输出。
- -s:指定每一行输出字符串的长度,默认是32。文件名一直全部输出。
- -c:统计每种系统调用所执行的时间,调用次数,出错次数。
- -d:输出strace 关于标准错误的调试信息。
- -h:输出简要的帮助信息。
- -i:输出系统调用的入口指针。
- -q:禁止输出关于脱离的消息。
- -tt:在输出中的每一行前加上时间信息,微秒级。
- -T:显示每一调用所耗的时间。
- -V :输出strace 的版本信息。
- -x:以十六进制形式输出非标准字符串。
- -xx:所有字符串以十六进制形式输出。
- -u:以username的UID和GID执行被跟踪的命令
- -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 输出写入到指定文件中的数据
三、具体用法介绍
1、跟踪指定进程