strace 可以跟踪一个应用程序所有的系统调用及调用后获得的返回值。
启动时跟踪
-o $file
指定输出文件,默认输出到终端
$ strace -o strace.log vim
打开另一个终端,就可以在目录下找到 strace.log 文件,例如查看 vim
在启动时读取的所有配置文件:
$ cat strace.log | grep "vimrc"
stat64("/usr/share/vim/vimrc", {st_mode=S_IFREG|0644, st_size=2215, ...}) = 0
open("/usr/share/vim/vimrc", O_RDONLY|O_LARGEFILE) = 6
stat64("/usr/share/vim/vimrc", {st_mode=S_IFREG|0644, st_size=2215, ...}) = 0
stat64("/etc/vim/vimrc.local", 0xbfdb7110) = -1 ENOENT (No such file or directory)
open("/etc/vim/vimrc.local", O_RDONLY|O_NONBLOCK|O_LARGEFILE) = -1 ENOENT (No such file or directory)
stat64("/home/kakoi/.vimrc", {st_mode=S_IFREG|0600, st_size=6019, ...}) = 0
open("/home/kakoi/.vimrc", O_RDONLY|O_LARGEFILE) = 7
stat64("/home/kakoi/.vimrc", {st_mode=S_IFREG|0600, st_size=6019, ...}) = 0
read(7, "ir .vimrc in order to\n\" "..., 4096) = 4096
运行时跟踪(-p $pid)
-e $func
只跟踪指定的系统调用
$ vim
打开另一个终端运行:
$ ps aux|grep vim
kakoi 8599 0.0 0.3 41660 7396 pts/8 Sl+ 10:33 0:00 vim a
kakoi 12070 0.0 0.0 6096 820 pts/2 S+ 10:36 0:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn vim
可以得到 vim
的进程号为 8599,运行:
$ sudo strace -e read,write -p 8599
现在就可以实时监控这个 vim
所有的 read, write 调用了。
统计信息(-c)
strace -c emacs
运行一段时间后退出,可以看到终端返回所有系统调用的次数耗时等信息:
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
99.09 0.008390 0 48116 46340 open
0.59 0.000050 3 16 1 waitpid
0.11 0.000009 0 1843 close
0.07 0.000006 0 9957 _llseek
0.07 0.000006 0 612 mmap2
0.07 0.000006 0 1164 134 stat64
0.00 0.000000 0 4270 3 read
0.00 0.000000 0 40 write
0.00 0.000000 0 10 2 unlink
0.00 0.000000 0 1 execve
0.00 0.000000 0 45 time
0.00 0.000000 0 2 chmod
....
在跟踪运行着的进程时,也可以通过 Ctrl-C
来获得统计信息而不退出进程。
其他参数
-f 可以跟踪所有由 fork 产生的子进程(vfork不被跟踪)
-F 会尝试跟踪 vfork 的调用
-ff 如果有 -o $file,则所有进程的跟踪结果会输出到 $file.$pid 中,其中 $pid 为各进程的进程号
-t 输出时加上时间信息
-tt 输出时加上时间信息(微秒级)
-T 输出加上每次系统调用消耗的时间
-v 输出完整的系统调用信息(默认部分频繁使用的调用不输出)