1、strace是什么
按照 strace 官网的描述,strace 是一个可用于诊断、调试和教学的 Linux 用户空间跟踪器。我们用它来监控用户空间进程和内核的交互,比如系统调用、信号传递、进程状态变更等。
strace 底层使用内核的 ptrace 特性来实现其功能。系统管理员、诊断人员和故障排除人员 会发现它对于解决程序问题非常有用。
运维的日常工作中,故障处理和问题诊断是个主要的内容,也是必备的技能。strace 作为一种动态跟踪工具,能够帮助运维高效地定位进程和服务故障。它像是一个侦探,通过系统调用的蛛丝马迹,告诉你异常的真相。
2、strace能做什么
工程维护都是实践派的人,我们还是先来个例子吧。
比如我们启动/rsyslogd,可是尝试启动时却报错,根本起不来!
/usr/sbin/rsyslogd -n -iNONE
假如没有明显的报错,我们应该怎么办呢,真相到底怎样呢?我们用 strace 来看看。
strace -tt -f /usr/sbin/rsyslogd -n -iNONE
我们注意到,在输出 run failed with error 错误的前一行,有个 open 系统调用:
它尝试打开文件 /etc/rsyslog.conf" 来读,可是却出错了,返回码是 -1 , 系统错误号为 ENOENT。
通过搜索open函数手册,ENOENT
是一个错误代码,其值通常为 2
,表示 "No such file or directory",即“没有这样的文件或目录”。
问题很明显就是 /etc/rsyslog.conf文件不存在导致。
原来是谁在环境上将文件给备份重命名了,修改之后启动征正常了。但不是所有“ -1 ENOENT (No such file or directory)”都会导致程序启动失败,这里要注意区分加以辨别。
因此,strace它能够打开应用进程的这个黑盒,通过系统调用的线索,告诉你进程大概在干嘛。
3、strace怎么用
strace 有两种运行模式。
- 一种是通过它启动要跟踪的进程。用法很简单,在原本的命令前加上 strace 即可。
- 另外一种运行模式,是跟踪已经在运行的进程,在不中断进程执行的情况下,理解它在干嘛。 这种情况,给 strace 传递个 -p pid 选项即可。
完成跟踪时,按 Ctrl + C 结束 strace 即可。
strace 有一些选项可以调整其行为,我们这里介绍下其中几个比较常用的,然后通过示例讲解其实际应用效果。
- -t 在输出中的每一行前加上时间信息。
- -tt 在输出中的每一行前加上时间信息,微秒级。
- -ttt 微秒级输出,以秒了表示时间。
- -T 显示每一调用所耗的时间。
- -v 输出所有的系统调用.一些调用关于环境变量,状态,输入输出等调用由于使用频繁,默认不输出。
- -V 输出strace的版本信息。
- -x 以十六进制形式输出非标准字符串。
- -xx 所有字符串以十六进制形式输出。
- -a column 设置返回值的输出位置.默认 为40。
- -e expr 指定一个表达式,用来控制如何跟踪.格式如下:
[qualifier=][!]value1[,value2]...
qualifier只能是 trace,abbrev,verbose,raw,signal,read,write其中之一。
value是用来限定的符号或数字,默认的 qualifier是 trace。
感叹号是否定符号.
例如:
-e open 等价于 -e trace=open 表示只跟踪open调用。而-e trace!=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 输出写入到指定文件中的数据。
- -o filename 将strace的输出写入文件filename
- -p pid 跟踪指定的进程pid.
- -s strsize 指定输出的字符串的最大长度.默认为32.文件名一直全部输出.
- -u username 以username 的UID和GID执行被跟踪的命令
比如下面两个命令的区别:
只跟踪有关文件操作的系统调用> strace -T -tt -v -f -e trace=file -o output.txt -s 1024 -p pid
跟踪所有操作系统的调用> strace -T -tt -v -f -e trace=all -o output.txt -s 1024 -p pid
4、strace问题定位案例(待更)
1、命令执行异常卡主
2、定位进程异常退出(结合sysmonitor监控)
3、性能分析等