您好,登錄后才能下訂單哦!
strace是一個非常簡單的工具,它可以跟蹤系統調用的執行。它常用來跟蹤進程執行時的系統調用和所接受的信號。在調試的時候,strace能幫助我們追蹤到一個程序所執行的而系統調用。當我們想知道程序和操作系統如何交互的時候,這時極其方便的,比如我們想知道執行了哪些系統調用,并且以何種順序執行。我們知道,在linux中,進程不能直接訪問硬件設備,當進程需要直接訪問硬件設備(比如讀取磁盤文件,接受網絡數據時),必須由用戶態模式切換至內核態模式,通過系統調用訪問硬件設備。strance可以追蹤到一個進程產生的系統調用,包括參數,返回值,執行消耗的時間等等。
同時,strance是一個集診斷,調試,統計于一體的工具。我們可以使用strance對應用的的系統調用和信號傳遞的跟蹤結果來對應用進行分析,以達到解決問題或者是了解應用工作過程的目的。
我們先來看看strace的命令都有哪些:
接下來我們通過一個打印“hello world”小程序來練習上面一些常用的選項:
從上面我們可以看到,當我們用strace執行test時,系統首先調用execv函數開始一個新的進程,接著進行一些環境初始化的一些操作,然后再調用write函數將“hello world”輸出到屏幕上,最后調用exit_group退出,就這樣完成整個程序的執行過程。
用-s參數實現截斷輸出:
-s參數用來指定trace的結果的每一行的輸出長度,同樣還是上面的程序,我們看看加了-s參數后的變化:
從上面的結果我們可以看到,本來我們是要輸出“hello world”的,當我們加上-s 選項之后,輸出了“hell”,實現了截斷。
我們再來看看strace的跟蹤信號傳遞功能:
我們這里還用上面的test程序,來觀察進程接受信號的情況。我們先strace ./test,然后打開另外一個窗口,輸入如下的命令 killall test,這時我們會看到程序退出了,結果如下:
上面的現象可以體現出來用strace可以跟蹤進程執行時所接受的信號。
用-c參數還能將進程所有的系統調用做一個統計分析,如下的現象:
從上圖我們可以很清楚的知道我們執行一個進程時,調用了哪些系統函數,調用的次數,消耗的時間等信息,這對我們分析一個程序來說是非常有用的。
用-o選項實現重定向輸出:參數-o用于將strace的輸出重定向到文件中,如果不指定-o的話,默認的輸出是stderr,格式是 -o filename,和使用2 > filename是一樣的。我們來看看:
用-T選項可以打印出每個系統調用所花費的時間,也就是每行最右邊的尖括號里面(我在圖中用紅顏色的框畫出來的)。這是一個很有用的功能,strace會將系統調用每次的時間記錄下來,我們可以使用-t/tt/ttt看到,比如下面:
我們來說一下這三個參數的區別:-t 輸出結果精確到秒,-tt輸出結果精確到微秒,-ttt精確到微秒,而且時間表示為unix時間戳。
用-p追蹤一個現有的進程,用法是 strace -p pid,我們看如下例子:
我們的程度是先獲得進程的id,并輸出“hello world”,然后sleep 30秒,在這期間,我們用strace追蹤該進程,輸出上圖的信息,30秒后,進程結束,死奧用seit_group函數。
用-e選項來進行特定的系統調用(例如open,write)等:
如上,我們我規定查看open的系統調用,并輸出了相應的信息。
用-r參數展示系統調用之間的相對時間戳:
其他選項的例子就不一一例舉了,以上幾個選項時比較常用的。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。