strace命令用法詳解:
strace常用來跟蹤進程執行時的系統調用和所接收的信號。 在Linux世界,進程不能直接訪問硬件設備,當進程需要訪問硬件設備(比如讀取磁盤文件,接收網絡數據等等)時,必須由用戶態模式切換至內核態模式,通過系統調用訪問硬件設備。strace可以跟蹤到一個進程產生的系統調用,包括參數,返回值,執行消耗的時間。
strace常用參數:
-p 跟蹤指定的進程
-f 跟蹤由fork子進程系統調用
-F 嘗試跟蹤vfork子進程系統調吸入,與-f同時出現時, vfork不被跟蹤
-o filename 默認strace將結果輸出到stdout。通過-o可以將輸出寫入到filename文件中
-ff 常與-o選項一起使用,不同進程(子進程)產生的系統調用輸出到filename.PID文件
-r 打印每一個系統調用的相對時間
-t 在輸出中的每一行前加上時間信息。 -tt 時間確定到微秒級。還可以使用-ttt打印相對時間
-v 輸出所有系統調用。默認情況下,一些頻繁調用的系統調用不會輸出
-s 指定每一行輸出字符串的長度,默認是32。文件名一直全部輸出
-c 統計每種系統調用所執行的時間,調用次數,出錯次數。
-e expr 輸出過濾器,通過表達式,可以過濾出掉你不想要輸出
命令實例:
[root@tomcat02 ~]# strace cat /dev/null
execve("/bin/cat", ["cat", "/dev/null"], [/* 26 vars */]) = 0
brk(0) = 0x24ef000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b8443faf000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=70314, ...}) = 0
mmap(NULL, 70314, PROT_READ, MAP_PRIVATE, 3, 0) = 0x2b8443fb0000
close(3) = 0
open("/lib64/libc.so.6", O_RDONLY) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\360\355A\2428\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1979000, ...}) = 0
mmap(0x38a2400000, 3803304, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x38a2400000
mprotect(0x38a2597000, 2097152, PROT_NONE) = 0
mmap(0x38a2797000, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x197000) = 0x38a2797000
mmap(0x38a279c000, 18600, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x38a279c000
close(3) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b8443fc2000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b8443fc3000
arch_prctl(ARCH_SET_FS, 0x2b8443fc2b20) = 0
mprotect(0x38a2797000, 16384, PROT_READ) = 0
mprotect(0x38a1e1f000, 4096, PROT_READ) = 0
munmap(0x2b8443fb0000, 70314) = 0
brk(0) = 0x24ef000
brk(0x2510000) = 0x2510000
open("/usr/lib/locale/locale-archive", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=99158704, ...}) = 0
mmap(NULL, 99158704, PROT_READ, MAP_PRIVATE, 3, 0) = 0x2b8443fc4000
close(3) = 0
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
open("/dev/null", O_RDONLY) = 3
fstat(3, {st_mode=S_IFCHR|0666, st_rdev=makedev(1, 3), ...}) = 0
read(3, "", 32768) = 0
close(3) = 0
close(1) = 0
close(2) = 0
exit_group(0) = ?
每一行都是一條系統調用,等號左邊是系統調用的函數名及其參數,右邊是該調用的返回值。
strace 顯示這些調用的參數并返回符號形式的值。strace 從內核接收信息,而且不需要以任何特殊的方式來構建內核。
通用的完整用法:
strace -o output.txt -T -tt -e trace=all -p 28979
上面的含義是 跟蹤28979進程的所有系統調用(-e trace=all),并統計系統調用的花費時間,以及開始時間(并以可視化的時分秒格式顯示),最后將記錄結果存在output.txt文件里面。
2.在umount掛載目錄時,直接卡住了,最后用 strace df -Th分析后結果掛載出問題了
strace df -Th
3.用strace跟蹤 whoami的輸出:
strace -o whoami-strace.txt whoami
參考文檔:http://www.cnblogs.com/ggjucheng/archive/2012/01/08/2316692.html