簡介
strace 命令是一個集診斷、調試、統計與一體的工具,我們可以使用 strace 分析應用中涉及的系統調用和信號傳遞的跟蹤結果,以達到解決問題或者是了解應用工作過程的目的。
strace 與專業的調試工具比如說 gdb 之類的是沒法相比的,因為它不是一個專業的調試器。
strace 的最簡單的用法就是執行一個指定的命令,在指定的命令結束之后它也就退出了。在命令執行的過程中,strace 會記錄和解析命令進程的所有系統調用以及這個進程所接收到的所有的信號值。
安裝
yum install -y strace
語法
usage: strace [-dDffhiqrtttTvVxx] [-a column] [-e expr] ... [-o file][-p pid] ... [-s strsize] [-u username] [-E var=val] ...[command [arg ...]]or: strace -c [-D] [-e expr] ... [-O overhead] [-S sortby] [-E var=val] ...[command [arg ...]]-c 統計每一系統調用的所執行的時間,次數和出錯的次數等.?-d 輸出strace關于標準錯誤的調試信息.?-f 跟蹤由fork調用所產生的子進程.?-ff 如果提供-o filename,則所有進程的跟蹤結果輸出到相應的filename.pid中,pid是各進程的進程號.?-F 嘗試跟蹤vfork調用.在-f時,vfork不被跟蹤.?-h 輸出簡要的幫助信息.?-i 輸出系統調用的入口指針.?-q 禁止輸出關于脫離的消息.?-r 打印出相對時間關于,,每一個系統調用.?-t 在輸出中的每一行前加上時間信息.?-tt 在輸出中的每一行前加上時間信息,微秒級.?-ttt 微秒級輸出,以秒了表示時間.?-T 顯示每一調用所耗的時間.?-v 輸出所有的系統調用.一些調用關于環境變量,狀態,輸入輸出等調用由于使用頻繁,默認不輸出.?-V 輸出strace的版本信息.?-x 以十六進制形式輸出非標準字符串?-xx 所有字符串以十六進制形式輸出.?-a column 設置返回值的輸出位置.默認 為40.?-e expr 指定一個表達式,用來控制如何跟蹤.格式如下:?[qualifier=][!]value1[,value2]...?qualifier只能是 trace,abbrev,verbose,raw,signal,read,write其中之一.value是用來限定的符號或數字.默認的 qualifier是 trace.感嘆號是否定符號.例如:?-eopen等價于 -e trace=open,表示只跟蹤open調用.而-etrace!=open表示跟蹤除了open以外的其他調用.有兩個特殊的符號 all 和 none.?注意有些shell使用!來執行歷史記錄里的命令,所以要使用\\.?-e trace=set 只跟蹤指定的系統 調用.例如:-e trace=open,close,rean,write表示只跟蹤這四個系統調用.默認的為set=all.?-e trace=file 只跟蹤有關文件操作的系統調用.?-e trace=process 只跟蹤有關進程控制的系統調用.?-e trace=network 跟蹤與網絡有關的所有系統調用.?-e strace=signal 跟蹤所有與系統信號有關的 系統調用?-e trace=ipc 跟蹤所有與進程通訊有關的系統調用?-e abbrev=set 設定 strace輸出的系統調用的結果集.-v 等與 abbrev=none.默認為abbrev=all.?-e raw=set 將指 定的系統調用的參數以十六進制顯示.?-e signal=set 指定跟蹤的系統信號.默認為all.如 signal=!SIGIO(或者signal=!io),表示不跟蹤SIGIO信號.?-e read=set 輸出從指定文件中讀出 的數據.例如:?-e read=3,5?-e write=set 輸出寫入到指定文件中的數據.?-o filename 將strace的輸出寫入文件filename?-p pid 跟蹤指定的進程pid.?-s strsize 指定輸出的字符串的最大長度.默認為32.文件名一直全部輸出.?-u username 以username 的UID和GID執行被跟蹤的命令
示例
追蹤某進程:`strace -c -p 18892`。啟動 strace 之后,可以使用ctrl+c停止,停止之后將會輸出檢查的結果,如下所示:
[fenglepeng@centos]# strace -c -p 44709
strace: Process 44709 attached
^Cstrace: Process 44709 detached
% time ? ? seconds ?usecs/call ? ? calls ? ?errors syscall
------ ----------- ----------- --------- --------- ----------------85.18 ? ?1.231769 ? ? ? ? ? 3 ? ?348468 ? ? ? ? ? stat10.16 ? ?0.146847 ? ? ? ?2068 ? ? ? ?71 ? ? ? ? ? select4.66 ? ?0.067435 ? ? ? ? ?15 ? ? ?4227 ? ? ? 424 futex
------ ----------- ----------- --------- --------- ----------------
100.00 ? ?1.446051 ? ? ? ? ? ? ? ?352766 ? ? ? 424 total
其他示例:
查看所有程序運行 ?strace python server.py
查看所有程序運行 ?strace ./aa.sh查看打開系統調用情況 ? ? ?strace -e open ./aa.sh
查看打開關閉系統調用情況 ?strace -e open,close ./aa.sh
查看打開關閉系統調用時間 ?strace -T -e open,close python3 main.py (T 時間在后面顯示)查看打開關閉系統調用次數 ?strace -c -T -e open,close ./aa.sh (如程序一直在運行,停止后才會統計)
查看打開關閉系統調用時間 ?strace -t -T -e open,close ./aa.sh ?
查看打開關閉系統調用時間 ?strace -tt -T -e open,close ./aa.sh ?(tt?
查看打開系統調用輸入log ? strace -tt -T -e open -o trace.log ./aa.sh ?(-o 輸入trace.log文件)strace -tt -T -V -e trace=file -o /data/log/trace.log -s 1024 -p 23489
?