strace

Linux —— strace 命令

系统出问题了?strace定位根因!

strace -c ./myapp                           #统计调用次数、调用耗时等信息
strace -o output.txt ./myapp                #保存到output.txt
strace -e open,read,write ./myapp           #只跟踪open,read,writey文件操作
strace -e trace=file ./myapp                #跟踪文件相关的系统调用
strace -p <PID>                             #跟踪指定进程的系统调用, 进一步jstack分析死锁
strace -e trace=network ./myapp             #网络相关
strace -e connect,send,recv ./myapp         #跟踪connect,send,recv网络操作
strace -e trace=all -e status=failed ./myapp
strace -t ./myapp                           #打印时间戳
strace -r ./myapp                           #打印相对时间戳


• 配合ps、top查看进程状态
• 配合netstat、ss查看网络连接
• 配合lsof查看打开的文件
• 配合tcpdump分析网络包


-c
	统计每个系统调用的时间、次数和错误,并在程序退出时报告摘要
-C
	类似于 -c,但在进程运行时也打印常规输出
-D
	将跟踪进程作为分离的孙进程运行,而不是作为跟踪对象的父进程运行。这通过保持跟踪对象是调用进程的直接子进程来减少 strace 的可见效果
-d
	输出 strace 关于标准错误的调试信息
-f
	跟踪由 fork(2), vfork(2) and clone(2) 调用所产生的子进程
-ff
	如果提供 -o FILENAME,则所有进程的跟踪结果输出到相应的 FILENAME.pid 中,pid 是各进程的进程号 
-F
	该选项已废弃,作用等同于 -f
-h
	输出简要的帮助信息
-i
	在系统调用时打印指令指针
-q
	禁止附加、分离等信息。当输出被重定向到文件并直接运行命令而不是附加命令时,这将自动发生
-qq
	如果给定两次,则禁止关于进程退出状态的消息
-r
	在每次系统调用进入时打印相对时间戳。它记录连续系统调用开始之间的时间差
-t
	在输出中的每一行前加上时间信息
-tt
	如果给定两次,在输出中的每一行前加上微秒级的时间信息
-ttt
	如果给定三次,则打印的时间将包括微秒,并且开始部分将打印自纪元以来的秒数
-T
	显示每一系统调用所耗的时间 
-v
	输出所有的系统调用。一些调用关于环境变量,状态,输入输出等调用,由于使用频繁默认不输出
-V
	输出 strace 的版本信息.
-x
	以十六进制形式输出非标准字符串
-xx
	所有字符串以十六进制形式输出
-y
	与文件描述符参数关联的打印路径
-a COLUMN
	设置返回值的输出位置,默认为40
-b SYSCALL
	如果达到指定的系统调用,与跟踪进程分离。目前,只支持 execve。如果希望跟踪多线程进程,因此需要 -f,但不希望跟踪其(可能非常复杂的)子进程,则此选项非常有用
-e EXPR
	指定一个表达式,用来控制如何跟踪。格式如下: 
	[qualifier=][!]value1[,value2]... 
	qualifier 只能是 trace, abbrev, verbose, raw, signal, read, write 其中之一。value 是用来限定的符号或数字。默认的 qualifier 是 trace,感叹号是否定符号。例如:-e open 等价于 -e trace=open,表示只跟踪 open 调用。而 -etrace=!open 表示跟踪除了 ope 以外的所有其他调用。有两个特殊的符号 all 和 none,分别表示跟踪所有和不跟踪任何系统调用。注意有些 Shell 使用 ! 来执行历史记录里的命令,所以要使用反斜杠对 ! 进行转义
-e trace=SET
	只跟踪指定的系统调用。例如: -e trace=open,close,rean,write 表示只跟踪这四个系统调用,默认的为 trace=all 
-e trace=file
	只跟踪有关文件操作的系统调用
-e trace=process 
	只跟踪有关进程控制的系统调用
-e trace=network 
	跟踪与网络有关的所有系统调用
-e strace=signal
	跟踪所有与系统信号有关的系统调用 
-e trace=ipc 
	跟踪所有与进程通讯有关的系统调用
-e trace=desc
	跟踪所有与文件描述符相关的系统调用
-e trace=memory
	跟踪所有与内存映射相关的系统调用
-e abbrev=SET
	缩写打印大型结构的每个成员的输出。默认值是 abbrev=all。-v 选项的效果是 abbrev=none
-e verbose=SET
	为指定的系统调用集取消引用结构。默认是 verbose=all
-e raw=SET
	将指定的系统调用的参数以十六进制显示
-e signal=SET
	指定跟踪的系统信号,默认为 signal=all。如 signal=!SIGIO(或 signal=!io),表示不跟踪 SIGIO 信号
-e read=SET
	输出从指定文件描述符中读出的数据。例如:-e read=3,5
-e write=SET
	输出写入到指定文件中的数据
-o FILENAME
	将 strace 的输出写入指定文件
-O OVERHEAD
	将跟踪系统调用的开销设置为指定的微秒
-p PID
	跟踪指定的进程
-P PATH
	只跟踪系统调用的访问路径。多个 -P 选项可用于指定多个路径
-s STRSIZE
	指定输出的字符串的最大长度,默认为 32。注意,文件名不被认为是字符串,总是全部打印
-S SORTBY
	根据指定的条件对 -c 选项打印的直方图的输出进行排序。SORTBY 合法值是 time、calls、name 和 nothing,默认值是 time
-u USERNAME
	以指定用户的 UID、GID 和补充组执行被跟踪的命令
-E VAR=VAL
 	为命令设置环境变量
 -E VAR
 	从继承的环境变量列表中删除变量 VAR,然后将其传递给命令