strace命令是一个集诊断、调试、统计于一体的工具,我们可以使用strace对应用系统调用和信号传递的跟踪结果来对应用进行分析,以达到解决问题或是了解应用工作过程的目的。当然strace与专业调试工具比如gbd之类是没法相比的,因为它不是一个专业的调试器。
strace的最简单的用法就是执行一个指定的命令,在指定的命令结束之后他也就退出了。在命令执行过程中和解析命令进程的所有系统调用以及这个进程所接收到的所有信号值。
选项
-c 统计每一次系统调用的所执行的时间,次数和出错的次数等;
-d 输出strace关于标准错误的调试信息;
-f 跟踪由fork调用所产生的子进程;
-ff 如果提供-o filename,则所有进程的跟踪结果输出到相应的filename.pid中,pid是各进程的进程号。
-F 尝试跟踪vfork调用,在-f时vfork不被跟踪;
-h 输出简要的帮助信息;
-i 输出系统调用的入口指针;
-q 禁止输出关于脱离的消息;
-r 打印出相对时间关于每一个系统调用;
-t 在输出的每一行前加上时间信息;
-tt 在输出的每一行加上时间信息,微妙级;
-ttt 微妙级输出,以秒表示时间;
-T 显示每一次调用所耗的时间;
-v 输出所有的系统调用,一些调用关于环境变量,状态、输入输出等调用由于使用频繁,默认不输出;
-V 输出strace的版本信息;
-x 以16进制输出非标准字符串;
-xx 所有字符串以16进制输出;
-a column设置返回值的输出位置,默认为40;
-e expr 指定一个表达式,用来控制如何跟踪;
-e trace=set 只跟踪指定的系统调用;
-e trace=file 只跟踪有关文件操作的系统调用;
-e trace=process 只跟踪有关进程控制的系统调用;
-e trace=network 跟踪与网络相关的系统调用;
-e tracce=signal 跟踪所有与系统信号有关的系统调用;
-e trace=ipc 跟踪所有与进程通讯有关的系统调用;
-e abbrev=set 设定strace输出的系统6调用的结果集;
-e raw=set 将指定的系统调用的参数以16进制显示;
-e signal=set 指定跟踪的系统信号;
-e read=set 输出从指定文件中读出;
-e write=set 输出写入到指定文件中;
-o finame 将strace的输出写入文件filename;
-p pid 跟踪指定进程pid;
-s strsize 指定输出的字符串的最大的长度,默认32;
-u username 以username的uid和gid执行被跟踪的命令;
示例:
strace ./test.sh 跟踪执行程序;
strace tail -f /var/log/message;
killall tail; 跟踪信号传递;
strace -c ./test.sh 系统调用统计;
strace -c -o test.txt ./test
strace -c ./test 2>test.txt 重定向输出,以上两个都一样;
strace -T ./test 对系统调用进行计时;
strace -s 20 ./test 截断输出为20字符;
strace -p pid 追踪现有进程;
综合例子:
Oracle的lgwr进程:
ps -ef |grep lgwr
strace -tt -s 10 -o lgwr.txt -p 5912
grep pwrite\(20 lgwr.txt