2011年2月1日 星期二

strace命令用法


http://yuanma.org/data/2007/0201/article_2213.htm

strace命令用法

呼叫:
strace [ -dffhiqrtttTvxx ] [ -acolumn ] [ -eexpr ] ...
[ -ofile ] [ -ppid ] ... [ -sstrsize ] [ -uusername ] [ command [ arg ... ] ]

strace -c [ -eexpr ] ... [ -Ooverhead ] [ -Ssortby ] [ command [ arg ... ] ]
功能:
跟踪程式執行時的系統呼叫和所接收的信號.通常的用法是strace執行一直到commande結束.
並且將所呼叫的系統呼叫的名稱、參數和返回值輸出到標準輸出或者輸出到-o指定的文件.
strace
是一個功能強大的除錯,分析診斷工具.你將發現他是一個極好的幫手在你要除錯一個無法看到原始碼或者原始碼無法在編譯的程序.
你將輕鬆的學習到一個軟體是如何通過系統呼叫來實現他的功能的.而且作為一個程序設計師,你可以了解到在用戶態和核心態是如何通過系統呼叫和信號來實現程序的功能的.
strace
的每一行輸出包括系統呼叫名稱,然後是參數和返回值.這個例子:

strace cat /dev/null
他的輸出會有:
open(\"/dev/null\",O_RDONLY) = 3
有錯誤產生時,一般會返回-1.所以會有錯誤標誌和描述:
open(\"/foor/bar\",)_RDONLY) = -1 ENOENT (no such file or directory)
信號將輸出餵信號標誌和信號的描述.跟踪併中斷這個命令\"sleep 600\":
sigsuspend({}
--- SIGINT (Interrupt) ---
+++ killed by SIGINT +++
參數的輸出有些不一致.shell命令中的\">>tmp\",將輸出:
open(\"tmp\",O_WRONLY|O_APPEND|A_CREAT,0666) = 3
對於結構指針,將進行適當的顯示.:\"ls -l /dev/null\":
lstat(\"/dev/null\",{st_mode=S_IFCHR|0666},st_rdev=makdev[1,3],...}) = 0
請注意\"struct stat\" 的聲明和這裡的輸出.lstat的第一個參數是輸入參數,而第二個參數是向外傳值.

當你嘗試\"ls -l\" 一個不存在的文件時,會有:
lstat(/foot/ball\",0xb004) = -1 ENOENT (no such file or directory)
char*
將作為C的字符串類型輸出.沒有字符串輸出時一般是char* 是一個轉義字符,只輸出字符串的長度.
當字符串過長是會使用\"...\"省略.如在\"ls -l\"會有一個gepwuid呼叫讀取password文件:
read(3,\"root::0:0:System Administrator:/\"...,1024) = 422
當參數是結構數組時,將按照簡單的指針和數組輸出如:
getgroups(4,[0,2,4,5]) = 4
關於bit作為參數的情形,也是使用方括號,並且用空格將每一項參數隔開.:
sigprocmask(SIG_BLOCK,[CHLD TTOU],[]) = 0
這裡第二個參數代表兩個信號SIGCHLD SIGTTOU.如果bit型參數全部置位,則有如下的輸出:
sigprocmask(SIG_UNBLOCK,~[],NULL) = 0
這裡第二個參數全部置位.

參數說明:
-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是用來限定的符號或數字.默認的qualifiertrace.感嘆號是否定符號.例如:
-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
usernameUIDGID執行被跟踪的命令.

沒有留言:

張貼留言