strace -tt -T -v -f -e trace=file -o /data/log/strace.log -s 1024 -p 23489
-tt 在每行輸出的前面,顯示毫秒級別的時間
-T 顯示每次系統調用所花費的時間
-v 對於某些相關調用,把完整的環境變量,文件stat結構等打出來。
-f 跟蹤目標進程,以及目標進程創建的所有子進程
-e 控制要跟蹤的事件和跟蹤行為,比如指定要跟蹤的系統調用名稱
-o 把strace的輸出單獨寫到指定的文件
-s 當系統調用的某個參數是字符串時,最多輸出指定長度的內容,默認是32個字節
-p 指定要跟蹤的進程pid, 要同時跟蹤多個pid, 重復多次-p選項即可。
實例:跟蹤nginx, 看其啟動時都訪問了哪些文件
strace -tt -T -f -e trace=file -o /data/log/strace.log -s 1024 ./nginx
部分輸出:
輸出中,第一列顯示的是進程的pid, 接着是毫秒級別的時間,這個是-tt 選項的效果。
每一行的最后一列,顯示了該調用所花的時間,是-T選項的結果。
這里的輸出只顯示和文件訪問有關的內容,這是因為我們通過-e trace=file 選項指定了。
strace的-e trace選項
-e trace=file 跟蹤和文件訪問相關的調用(參數中有文件名)
-e trace=process 和進程管理相關的調用,比如fork/exec/exit_group
-e trace=network 和網絡通信相關的調用,比如socket/sendto/connect
-e trace=signal 信號發送和處理相關,比如kill/sigaction
-e trace=desc 和文件描述符相關,比如write/read/select/epoll等
-e trace=ipc 進程見同學相關,比如shmget等
strace -f -e trace=read,write -p 17151 -o log #跟蹤進程17151及子進程中read和write系統調用,輸出到log文件.
-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= 只跟蹤指定的系統 調用.例如:-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= 設定 strace輸出的系統調用的結果集.-v 等與 abbrev=none.默認為abbrev=all. -e raw= 將指 定的系統調用的參數以十六進制顯示. -e signal= 指定跟蹤的系統信號.默認為all.如 signal=!SIGIO(或者signal=!io),表示不跟蹤SIGIO信號. -e read= 輸出從指定文件中讀出 的數據.例如: -e read=, -e write=
通用的完整用法:
strace -o output.txt -T -tt -e trace=all -p 28979
上面的含義是 跟蹤28979進程的所有系統調用(-e trace=all),並統計系統調用的花費時間,以及開始時間(並以可視化的時分秒格式顯示),最后將記錄結果存在output.txt文件里面。
轉自:https://blog.csdn.net/cs729298/article/details/81906375