strace 可以跟蹤一個(gè)應(yīng)用程序所有的系統(tǒng)調(diào)用及調(diào)用后獲得的返回值。
啟動(dòng)時(shí)跟蹤
-o $file
指定輸出文件撑蒜,默認(rèn)輸出到終端
$ strace -o strace.log vim
打開另一個(gè)終端歹啼,就可以在目錄下找到 strace.log 文件玄渗,例如查看 vim
在啟動(dòng)時(shí)讀取的所有配置文件:
$ 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
運(yùn)行時(shí)跟蹤(-p $pid)
-e $func
只跟蹤指定的系統(tǒng)調(diào)用
$ vim
打開另一個(gè)終端運(yùn)行:
$ 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
的進(jìn)程號(hào)為 8599,運(yùn)行:
$ sudo strace -e read,write -p 8599
現(xiàn)在就可以實(shí)時(shí)監(jiān)控這個(gè) vim
所有的 read, write 調(diào)用了狸眼。
統(tǒng)計(jì)信息(-c)
strace -c emacs
運(yùn)行一段時(shí)間后退出藤树,可以看到終端返回所有系統(tǒng)調(diào)用的次數(shù)耗時(shí)等信息:
% 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
....
在跟蹤運(yùn)行著的進(jìn)程時(shí),也可以通過 Ctrl-C
來獲得統(tǒng)計(jì)信息而不退出進(jìn)程拓萌。
其他參數(shù)
-f 可以跟蹤所有由 fork 產(chǎn)生的子進(jìn)程(vfork不被跟蹤)
-F 會(huì)嘗試跟蹤 vfork 的調(diào)用
-ff 如果有 -o $file岁钓,則所有進(jìn)程的跟蹤結(jié)果會(huì)輸出到 $file.$pid 中,其中 $pid 為各進(jìn)程的進(jìn)程號(hào)
-t 輸出時(shí)加上時(shí)間信息
-tt 輸出時(shí)加上時(shí)間信息(微秒級(jí))
-T 輸出加上每次系統(tǒng)調(diào)用消耗的時(shí)間
-v 輸出完整的系統(tǒng)調(diào)用信息(默認(rèn)部分頻繁使用的調(diào)用不輸出)