Linux進程追蹤者之"strace"

strace 被用來追蹤某一條進程的訪問路徑,在執行過錯中調用的函數等等
對研究單個進程的執行過程很有幫助。

strace 命令:
strace 【strace參數】 【追蹤對象】

strace參數:
首先,簡單說說它的使用參數,Strace的參數包括輸出參數、過濾參數、統計參數、跟蹤參數、啓動參數和其他雜項。詳細的看幫助文檔或者搜索它的用法,我們只簡單介紹幾個常用的參數:
-p Pid 跟蹤指定的進程號的進程。
-o 文件 輸出追蹤信息到文件。
-f 跟蹤由fork調用所產生的子進程。
-e expr 表達式,用指定追蹤的方法,常見有:
-e trace=open,close,rean,write 跟蹤這四個系統函數的調用,默認的爲set=all。
-e trace=file 跟蹤有關文件操作的系統調用。
-e trace=process 跟蹤進程調用。
-e strace=signal 跟蹤所繫統信號調用。

-d 輸出debug信息到標準錯誤輸出。
-c 統計功能,統計系統調用次數,時間和出錯次數等信息。
-t/r 輸出調用的絕對/相對時間戳。
-u 用戶名 追蹤特定用戶的進程。

下面是相關實踐:

用法一:追蹤腳本或進程的執行情況

追蹤腳本的運行調用的函數與執行情況,可以用strace 【執行語句】,或者在進程運行時,strace -p PID:
在這裏插入圖片描述
每一行都是一條系統調用,等號左邊是系統調用的函數名及其參數,右邊是該調用的返回值。
strace 顯示這些調用的參數並返回符號形式的值。strace 從內核接收信息,而且不需要以任何特殊的方式來構建內核。
追蹤一個進程:
在這裏插入圖片描述這種用法同樣可以用來調試程序(比如XX服務啓動失敗,執行失敗)
strace -f -F -o ~/XXX-strace.txt ./start demosvr.sh
追蹤fork與vfork進程,並將啓動demosvr.sh的信息 寫入strace.txt

strace -o output.txt -T -tt -e trace=all -p 55606
跟蹤55606進程的所有系統調用(-e trace=all),並統計系統調用的花費時間,以及開始時間(並以可視化的時分秒格式顯示),最後將記錄結果存在output.txt文件裏面

用法二:查找運行的服務調用的文件

使用strace -tf 查找進程運行時是否讀過某個文件,需要結合管道grep等使用,進行篩選:
注意:starce輸出結果是輸出到標準錯誤2的,當做debug信息了。而|管道傳遞給grep的只是標準輸出1 ,若不加轉換則grep 篩選 不起作用(標準輸出爲空)。所以必須要加上“2>&1”,要把標準錯誤的信息先重定向到標準輸出1。否則會全部輸出在這裏插入圖片描述
通過strace也可以查看某個進程或服務的性能詳細:使用strace -c 即可統計一段時間內的進程性能包括系統調用、耗時、和錯誤次數:
time:時間佔比
seconds:用時(秒)
users/call:每個系統調用平均耗時(微秒)
calls:總的調用次數
error:錯誤數
syscall:系統調用的類型
在這裏插入圖片描述

用法三:查找消耗資源的子進程

先使用top命令找出cpu使用過大的子進程,再使用strace追蹤子進程,查看爲什麼使用過高
在這裏插入圖片描述
追蹤這個進程 strace -tf -p 909
在這裏插入圖片描述
信息顯示了進程調用系統函數的情況,具體函數參考這裏

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章