strace

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 输出完整的系统调用信息(默认部分频繁使用的调用不输出)

你可能感兴趣的:(strace)