【個人Linux,我作主!】strace指令調試詳解

目錄:
(一)strace命令簡介
(二)strace命令實戰shell


(一)strace命令簡介
(1.1)strace命令主要是用來監控咱們程序的執行狀況,當咱們在Linux系統的用戶空間運行一個程序的時候,Linux系統會將咱們運行的程序封裝成一個進程的形式,而後參與操做系統的調度,所以咱們可使用strace命令去跟蹤咱們的應用程序它的相關的運行狀況,好比監控用戶進程與內核進程的交互,以及跟蹤進程的系統調用、信號傳遞、狀態變化等。此時咱們均可以經過這個strace命令去調試咱們程序具體出錯的緣由。
(1.2)通常咱們的系統調用主要包括①文件和設備訪問:open、close、read、write、ioctl等;②進程管理:fork、clone、execve、exit等;③信號:signal、kill等;④內存管理:brk、mmap、mlock等;⑤進程間通訊:semget、信號量、消息隊列等;⑥網絡通訊:socket、connect等。
(1.3)strace命令的參數及含義以下所示:
-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 cloumn:設置返回值的輸出位置,默認爲40
-e [expr]:指定一個表達式,用來控制如何跟蹤,格式[qualifier=][!]value1[,value2]
qualifier只能是trace,abbrev,verbose,raw,singal,[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,表示不跟蹤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執行被跟蹤的命令
(1.4)咱們在系統中編輯一個strace.c的程序文件,而後寫上以下的一段代碼(圖1-1),而後使用gcc編譯strace.c程序後,在系統中會自動生成一個a.out的可執行文件,此時咱們執行a.out的文件後系統出現了報錯並生成了一個test.dat的文件(圖1-2)。
【個人Linux,我作主!】strace指令調試詳解
【個人Linux,我作主!】strace指令調試詳解
(1.5)此時咱們可使用strace命令查看./a.out執行的時候相關係統調用的過程。
# strace ./a.out---查看./a.out執行的時候相關係統調用的過程
【個人Linux,我作主!】strace指令調試詳解網絡


(二)strace命令實戰
(2.1)查看一個程序全部的open、close系統調用。
# strace -e open,close ./a.out---使用-e參數查看a.out執行文件的open和close的調用狀況
【個人Linux,我作主!】strace指令調試詳解
(2.2)查看每一個系統調用消耗的時間。
# strace -T -e open,close ./a.out---咱們使用-T參數能夠查看系統每一個系統調用所消耗的時間
【個人Linux,我作主!】strace指令調試詳解
(2.3)統計系統調用次數、錯誤次數統計。
# strace -c -e open,close ./a.out---使用-c參數查看系統調用次數和錯誤次數統計
【個人Linux,我作主!】strace指令調試詳解
(2.4)打印系統調用的時間戳。
# strace -t -T -e open,close ./a.out---使用-t命令能夠查看系統調用的時間戳
# strace -tt -T -e open,close ./a.out---此時咱們能夠查看微秒級的系統調用的時間戳
【個人Linux,我作主!】strace指令調試詳解
【個人Linux,我作主!】strace指令調試詳解
(2.5)將跟蹤日誌保存到log文件中。
# strace -tt -T -e open,close -o log ./a.out---咱們可使用-o參數將跟蹤日誌保存到log文件中
【個人Linux,我作主!】strace指令調試詳解
(2.6)最後咱們再來分析一下使用strace -e來查看open系統調用後的問題與狀態,當咱們打開一個文件是成功的時候,那麼系統會返回一個非負整數,因此係統在打開test.dat文件時,會返回一個3值,可是若是咱們打開一個文件是失敗的,那麼系統會返回一個負數,因此此時系統打開並不存在的hello.dat文件時,返回的是-1值。由此咱們即可以實現經過strace命令來查找程序運行報錯緣由的目標。
# strace -e open ./a.out---查看一個程序全部的open系統調用
【個人Linux,我作主!】strace指令調試詳解socket

—————— 本文至此結束,感謝閱讀 ——————ide

相關文章
相關標籤/搜索