strace
是Linux環境下的一款程序調試工具,用於檢查一個應用程序所使用的系統調用以及它所接收的系統信息。strace會追蹤程序運行時的整個生命周期,輸出每一個系統調用的名字、參數、返回值和執行所消耗的時間等,是高級運維和開發人員排查問題的殺手銅。
strace命令的參數選項及說明
-c 統計每一個系統調用所執行的時間、次數和出錯的次數等 -d 輸出strace關於標准錯誤的調試信息 -f 跟蹤目標進程,以及目標進程創建的所有子進程 -ff 如果提供-o filename,則將所有進程的跟蹤結果輸出到相應的filename.pid中,pid是各進程的進程號 -i 輸出系統調用的入口指針 -q 禁止輸出關於脫離的消息 -r 輸出每一個系統調用的相對時間 -t 在輸出中的每一行前加上時間信息。例如16:45:28 -tt 在輸出中的每一行前加上時間信息,精確到微秒。例如11:18:59.759546端 -ttt 在輸出中的每一行前加上時間信息,精確到微秒,而且時間表示為UNIX時間戳。例如1486111461.650434 -T 顯示每次系統調用所花費的時間 -v 對於某些相關調用,把完整的環境變量、文件stat結構等打印出來 -x 以十六進制形式輸出非標准字符率 -xx 所有字符串以十六進制形式輸出 -e expr 輸出過濾器,通過表達式,可以過濾掉你不想要的輸出 expr是一個表達式,用於控制如何跟蹤:[qualifier=][!][valuel[,value2].. 說明: ①qualifier 只能是trace、abbrev、verbose、raw、signal、read、write其中之一 ②value是用來限定的符號或數字 ③默認的qualifier是trace ④感嘆號是否定符號 例如: -e open等價於-e trace=open,表示只跟蹤open調用 而-e trace!=open表示跟蹤除了open以外的其他調用 常見選項: -e trace=[set] 只跟蹤指定的系統調用 -e trace=file 只跟蹤與文件操作有關的系統調用 -e trace=process 只跟蹤與進程控制有關的系統調用 -e trace-network 只跟蹤與網絡有關的系統調用 -e trace=signal 只跟蹤與系統信號有關的系統調用 -e trace=desc 只跟蹤與文件描述符有關的系統調用 -e trace=ipc 只跟蹤與進程通信有關的系統調用 -e abbrev=[set] 設定strace輸出的系統調用的結果集 -e raw=[set] 將指定的系統調用的參數以十六進制顯示 -e signal=[set] 指定跟蹤的系統信號 -e read=[set] 輸出從指定文件中讀出的數據 -e write=[set] 輸出寫入到指定文件中的數據 -o filename 將strace的輸出寫入文件filename -p pid 指定要跟蹤的進程pid,要同時跟蹤多個pid,重復多次p選項即可* -s strsize 指定輸出的字符串的最大長度,默認為32。並沒有將文件名視為字符串,默認全部輸出 -u username 以usemame的UID和GID執行所跟蹤的命令
排查Nginx403 forbidden錯誤
strace -tt -f /applicatton/nginx/sbin/nginx
只跟蹤與文件操作有關的系統調用
strace -tt -f -e trace=file /application/nginx/sbin/nginx #只跟綜與文件操作有關的系統調用。
通過pid 跟蹤進程
[root@bzhl ~]# pgrep nginx
1884
7785
7786
7787
[root@bzhl ~]# pstree -p 1884
nginx(1884)─┬─nginx(7785)
├─nginx(7786)
└─nginx(7787)
[root@bzhl ~]# strace -tt -f -e trace=file -p 7785
strace: Process 7785 attached
跟蹤系統調用統計
strace不僅能夠追蹤系統調用,使用選項-c還能對進程所有的系統調用做一個統計分析。
[root@bzhl ~]# which nginx /usr/bin/nginx [root@bzhl ~]# strace -c /usr/bin/nginx % time seconds usecs/call calls errors syscall ------ ----------- ----------- --------- --------- ---------------- 22.33 0.001129 7 153 52 open 15.55 0.000786 6 123 close 10.80 0.000546 6 95 mmap 8.53 0.000431 13 32 write 7.66 0.000387 10 39 read 6.47 0.000327 7 48 mprotect 5.38 0.000272 12 22 munmap 4.35 0.000220 3 87 fstat 3.20 0.000162 32 5 nanosleep 2.87 0.000145 8 19 socket 2.67 0.000135 4 38 pread64 2.29 0.000116 29 4 4 connect 1.19 0.000060 4 15 15 bind 1.03 0.000052 3 16 5 stat 1.03 0.000052 9 6 getdents 0.99 0.000050 3 15 setsockopt 0.65 0.000033 11 3 openat 0.63 0.000032 2 15 ioctl 0.63 0.000032 5 6 6 mkdir 0.47 0.000024 2 12 fcntl 0.16 0.000008 8 1 statfs 0.14 0.000007 7 1 1 readlink 0.10 0.000005 5 1 epoll_create 0.08 0.000004 2 2 rt_sigaction 0.08 0.000004 2 2 uname 0.08 0.000004 2 2 gettimeofday 0.08 0.000004 4 1 futex 0.06 0.000003 3 1 poll 0.06 0.000003 3 1 lseek 0.06 0.000003 2 2 getrlimit 0.06 0.000003 3 1 getppid 0.06 0.000003 3 1 sched_getaffinity 0.04 0.000002 1 2 brk 0.04 0.000002 2 1 rt_sigprocmask 0.04 0.000002 2 1 getuid 0.04 0.000002 2 1 arch_prctl 0.04 0.000002 2 1 set_tid_address 0.04 0.000002 2 1 set_robust_list 0.02 0.000001 1 1 geteuid 0.00 0.000000 0 1 1 access 0.00 0.000000 0 1 execve ------ ----------- ----------- --------- --------- ---------------- 100.00 0.005055 779 84 total
上面的結果將清楚地告訴我們調用了哪些系統函數,調用的次數是多少,消耗了多少時間等信息,這對我們分析程序來說是非常有用的。
重定向輸出。
strace -c -o tongji.log /application/nginx/sbin/nginx #用 -o 選項將strace的結果輸出到文件中
對系統調用進行計時
strace -T /application/nginx/sbin/ngirnx #<=使用選項-T將每個系統調用所花費的時間打印出來,每個調用的時間花費在調用行最右邊的尖括導里面。
小結:strace命令很適合處埋程序僵屍、命令執行報錯等問題,如果從程序日志和系統日志中看不出問題出現的原因,則可以strace一下,也許會有答案,不過也需要使用者有足夠的耐心去查看輸出!
ltrace:跟蹤進程調用庫函數
ltrace 能夠跟蹤進程的庫函數調用,它會顯現出調用了哪個庫函數,而 strace則是跟蹤進程的每個系統調用。
ltrace命令的參數選項及說明
-c 統計庫函數每次調用的時間,最后程序退出時打印摘要 -C 解碼低級別名稱(內核級)為用戶級名稱 -d 打印調試信息 -e expr 輸出過濾器,通過表達式,可以過濾掉你不想要的輸出 -e printf 表示只查看printf函數調用 -e !printf 表示查看除printf函數以外的所有函數調用 -f 跟蹤子進程 -o filename 將ltrace的輸出寫入文件filename -p pid 指定要跟蹤的進程pid -r 輸出每一個調用的相對時間 -S 顯示系統調用 -t 在輸出中的每一行前加上時間信息。例如16:45:28 -tt 在輸出中的每一行前加上時間信息,精確到微秒。例如11:18:59.759546 -ttt 在輸出中的每一行前加上時間信息,精確到微秒,而且時間表示為UNIX時間截。例如1486111461.650434 -T 顯示每次調用所花費的時間 -u username 以username的UID和GID執行所跟蹤的命令
Itrace使用
ltrace的用法與strace非常相似,選項功能也是類似
[root@bzhl ~]# ltrace /usr/bin/nginx
通過pid 跟蹤進程調用庫函數。
[root@bzhl ~]# pgrep nginx
1884
7785
7786
7787
[root@bzhl ~]# ltrace -p 1884