鍍金池/ 教程/ Linux/ strace 跟蹤進程中的系統(tǒng)調(diào)用
進程管理工具
objdump 二進制文件分析
scp 跨機遠程拷貝
crontab 定時任務(wù)
readelf elf文件格式分析
pstack 跟蹤進程棧
系統(tǒng)管理及IPC資源管理
vmstat 監(jiān)視內(nèi)存使用情況
strace 跟蹤進程中的系統(tǒng)調(diào)用
sar 找出系統(tǒng)瓶頸的利器
ipcs 查詢進程間通信狀態(tài)
ps 進程查看器
性能優(yōu)化
wget 文件下載
top linux下的任務(wù)管理器
磁盤管理
size 查看程序內(nèi)存映像大小
free 查詢可用內(nèi)存
文件及目錄管理
iostat 監(jiān)視I/O子系統(tǒng)
性能監(jiān)控
程序構(gòu)建
學(xué)會使用命令幫助
gdb 調(diào)試利器
網(wǎng)絡(luò)工具
nm 目標(biāo)文件格式分析
lsof 一切皆文件
用戶管理工具
程序調(diào)試
ldd 查看程序依賴庫
文本處理

strace 跟蹤進程中的系統(tǒng)調(diào)用

strace常用來跟蹤進程執(zhí)行時的系統(tǒng)調(diào)用和所接收的信號。 在Linux世界,進程不能直接訪問硬件設(shè)備,當(dāng)進程需要訪問硬件設(shè)備(比如讀取磁盤文件,接收網(wǎng)絡(luò)數(shù)據(jù)等等)時,必須由用戶態(tài)模式切換至內(nèi)核態(tài)模式,通過系統(tǒng)調(diào)用訪問硬件設(shè)備。strace可以跟蹤到一個進程產(chǎn)生的系統(tǒng)調(diào)用,包括參數(shù),返回值,執(zhí)行消耗的時間。

輸出參數(shù)含義

每一行都是一條系統(tǒng)調(diào)用,等號左邊是系統(tǒng)調(diào)用的函數(shù)名及其參數(shù),右邊是該調(diào)用的返回值。 strace 顯示這些調(diào)用的參數(shù)并返回符號形式的值。strace 從內(nèi)核接收信息,而且不需要以任何特殊的方式來構(gòu)建內(nèi)核。

$strace cat /dev/null 
execve("/bin/cat", ["cat", "/dev/null"], [/* 22 vars */]) = 0
brk(0)                                  = 0xab1000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f29379a7000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
...

參數(shù)

-c 統(tǒng)計每一系統(tǒng)調(diào)用的所執(zhí)行的時間,次數(shù)和出錯的次數(shù)等. 
-d 輸出strace關(guān)于標(biāo)準(zhǔn)錯誤的調(diào)試信息. 
-f 跟蹤由fork調(diào)用所產(chǎn)生的子進程. 
-ff 如果提供-o filename,則所有進程的跟蹤結(jié)果輸出到相應(yīng)的filename.pid中,pid是各進程的進程號. 
-F 嘗試跟蹤vfork調(diào)用.在-f時,vfork不被跟蹤. 
-h 輸出簡要的幫助信息. 
-i 輸出系統(tǒng)調(diào)用的入口指針. 
-q 禁止輸出關(guān)于脫離的消息. 
-r 打印出相對時間關(guān)于,,每一個系統(tǒng)調(diào)用. 
-t 在輸出中的每一行前加上時間信息. 
-tt 在輸出中的每一行前加上時間信息,微秒級. 
-ttt 微秒級輸出,以秒了表示時間. 
-T 顯示每一調(diào)用所耗的時間. 
-v 輸出所有的系統(tǒng)調(diào)用.一些調(diào)用關(guān)于環(huán)境變量,狀態(tài),輸入輸出等調(diào)用由于使用頻繁,默認不輸出. 
-V 輸出strace的版本信息. 
-x 以十六進制形式輸出非標(biāo)準(zhǔn)字符串 
-xx 所有字符串以十六進制形式輸出. 
-a column 
設(shè)置返回值的輸出位置.默認 為40. 
-e expr 
指定一個表達式,用來控制如何跟蹤.格式如下: 
[qualifier=][!]value1[,value2]... 
qualifier只能是 trace,abbrev,verbose,raw,signal,read,write其中之一.value是用來限定的符號或數(shù)字.默認的 qualifier是 trace.感嘆號是否定符號.例如: 
-eopen等價于 -e trace=open,表示只跟蹤open調(diào)用.而-etrace!=open表示跟蹤除了open以外的其他調(diào)用.有兩個特殊的符號 all 和 none. 
注意有些shell使用!來執(zhí)行歷史記錄里的命令,所以要使用\\. 
-e trace=set 
只跟蹤指定的系統(tǒng) 調(diào)用.例如:-e trace=open,close,rean,write表示只跟蹤這四個系統(tǒng)調(diào)用.默認的為set=all. 
-e trace=file 
只跟蹤有關(guān)文件操作的系統(tǒng)調(diào)用. 
-e trace=process 
只跟蹤有關(guān)進程控制的系統(tǒng)調(diào)用. 
-e trace=network 
跟蹤與網(wǎng)絡(luò)有關(guān)的所有系統(tǒng)調(diào)用. 
-e strace=signal 
跟蹤所有與系統(tǒng)信號有關(guān)的 系統(tǒng)調(diào)用 
-e trace=ipc 
跟蹤所有與進程通訊有關(guān)的系統(tǒng)調(diào)用 
-e abbrev=set 
設(shè)定 strace輸出的系統(tǒng)調(diào)用的結(jié)果集.-v 等與 abbrev=none.默認為abbrev=all. 
-e raw=set 
將指 定的系統(tǒng)調(diào)用的參數(shù)以十六進制顯示. 
-e signal=set 
指定跟蹤的系統(tǒng)信號.默認為all.如 signal=!SIGIO(或者signal=!io),表示不跟蹤SIGIO信號. 
-e read=set 
輸出從指定文件中讀出 的數(shù)據(jù).例如: 
-e read=3,5 
-e write=set 
輸出寫入到指定文件中的數(shù)據(jù). 
-o filename 
將strace的輸出寫入文件filename 
-p pid 
跟蹤指定的進程pid. 
-s strsize 
指定輸出的字符串的最大長度.默認為32.文件名一直全部輸出. 
-u username 
以username 的UID和GID執(zhí)行被跟蹤的命令

命令實例

跟蹤可執(zhí)行程序

strace -f -F -o ~/straceout.txt myserver

-f -F選項告訴strace同時跟蹤fork和vfork出來的進程,-o選項把所有strace輸出寫到~/straceout.txt里 面,myserver是要啟動和調(diào)試的程序。

跟蹤服務(wù)程序

strace -o output.txt -T -tt -e trace=all -p 28979

跟蹤28979進程的所有系統(tǒng)調(diào)用(-e trace=all),并統(tǒng)計系統(tǒng)調(diào)用的花費時間,以及開始時間(并以可視化的時分秒格式顯示),最后將記錄結(jié)果存在output.txt文件里面。

上一篇:程序調(diào)試下一篇:磁盤管理