strace追蹤程式使用的system call


追蹤指令使用的system call

strace cat /dev/null

-t 追蹤輸出加入時間資訊, 時:分:秒
-tt 使用時:分:秒.微秒資訊, 例如11:22:33.123456
-ttt 使用timestamp微秒數值
-r 顯示相對時間
-T 顯示耗用時間

-o {Output file path} 輸出到檔案, 如果不使用-o 也可以用重導向stderr 2>{Output file path} 

-c 統計呼叫的次數與錯誤
-x 以十六進位輸出含有不可印的字串
-xx 所有字串以十六進位輸出
-s {length} 輸出字串時最多印出的字數, 超過就會在後面加上...表示大於長度

-v 輸出所有的系統呼叫, 因為會太多資訊所以一般會使用-e指定要追蹤的類型
-f 追蹤fork
-ff 追蹤fork, 如果有-o選項的話, fork的pid會輸出到{Output file path}.{pid}
-F 追蹤vfork

-u {username} 以特定使用者執行程式並追蹤

追蹤已啟動的process運作

strace -p {ProcessID}

追蹤特定的system call

像是可以用-eopen來追蹤loader載入的library

strace -eopen -f ./test


或是追蹤gcc的運作

strace -eopen -f gcc test.c -o test


-e 的語法是 -e [qualifier=][!]value1[,value2]...

qualifier的選項有trace,abbrev,verbose,raw,signal,read,write,預設不寫是用trace,
所以上面的指令用-eopen等於是-e trace=open

!表示不包含/排除

value的選項通常有open,close,rean,write,all,none,
trace本身有額外的value可用, file,procee,Network,signal,ipc
signal有其他的用法, 像是要排除signal SIGIO的部分, 可以寫-e signal=!SIGIO

實際使用

strace -t -e trace=open,close,read,getdents,write,connect,accept ls >/dev/null

參考:
http://man.linuxde.net/strace
http://www.itread01.com/articles/1476117407.html

留言