功能:trace system calls and signals
strace能够跟踪进程使用的系统调用,并显示调用过程信息。本文章只给出比较常用的命令。
注:
(1)a.out表示要被strace跟踪的用户可执行程序,
(2)`pidof ./a.out`表示要被strace跟踪的正在运行的a.out对应的进程PID
(3)由于操作起来很简单,暂时不给出测试用例。
1)跟踪指定程序
$strace ./a.out
2)跟踪指定进程
$strace -p $(pidof ./a.out)
或者
$strace -p `pidof ./a.out`3
3)将strace显示内容输出到指定日志中
$strace -p $(pidof ./a.out) -o strace.log
$strace ./a.out -o strace.log
4)显示系统调用的执行时间
$strace -t ./a.out #执行时间的单位为秒
$strace -tt ./a.out #执行时间的单位为毫秒
6)显示执行系统调用接口的用户程序代码行地址
$strace -i ./a.out
7)跟踪进程中fork()之后的进程
$strace -f ./a.out
8)将所有进程的跟踪结果输出到指定日志filename.
注:filename是由-o filename提供的
$strace -ff -o strace.log ./a.out
将会产生strace.log.6800、strace.log.6801类似以进程号结尾命令的文件log日志。
9)strace还可以跟踪指定的事件(event)
$strace -e trace=write ./a.out #表示只跟踪系统调用接口write的调用跟踪信息
$strace -e trace=write,read ./a.out #跟踪write,read这两者的调用
$strace -e trace=file ./a.out #只跟踪有关文件操作的系统调用
$strace -e trace=process ./a.out #只跟踪有关进程控制的系统调用
$strace -e trace=network ./a.out #只跟踪与网络有关的系统调用
$strace -e trace=signal ./a.out #只跟踪与系统信号有关的系统调用
$strace -e trace=ipc ./a.out #只跟踪与进程间通信有关的系统调用
10)还可以跟踪指定的系统信号
$strace -e signal != SIGIO ./a.out #表示不跟踪ISGIO系统信号
$strace -e signal = SIGPIPE #表示跟踪SIGPIPE系统信号
11)还可以对系统接口函数操作的文件进行跟踪
$strace -e read=3,5 ./a.out #输出从指定文件中读出的数据
$strace -e write=3 ./a.out #输出写入到指定指定文件中的数据
12)比较重要的一个使用是:统计每个系统调用的执行时间、次数和出错次数等信息!
$strace -c ./a.out
这是一个很有用的选项,当需要对指定程序进行系统调用的热点进行查找时!
给出-c选项的使用示例:
从执行结果看出,-c选项的信息统计列有:执行时间的半分比、执行的时间、被调用次数、调用时出错次数、对应的syscall名称
最后还有一行时总结以上所有的信息总和。
《完》