溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

strace常用命令學(xué)習(xí)

發(fā)布時(shí)間:2020-04-27 10:29:31 來(lái)源:網(wǎng)絡(luò) 閱讀:1215 作者:小楊楊雪松 欄目:編程語(yǔ)言

       strace是一個(gè)非常簡(jiǎn)單的工具,它可以跟蹤系統(tǒng)調(diào)用的執(zhí)行。它常用來(lái)跟蹤進(jìn)程執(zhí)行時(shí)的系統(tǒng)調(diào)用和所接受的信號(hào)。在調(diào)試的時(shí)候,strace能幫助我們追蹤到一個(gè)程序所執(zhí)行的而系統(tǒng)調(diào)用。當(dāng)我們想知道程序和操作系統(tǒng)如何交互的時(shí)候,這時(shí)極其方便的,比如我們想知道執(zhí)行了哪些系統(tǒng)調(diào)用,并且以何種順序執(zhí)行。我們知道,在linux中,進(jìn)程不能直接訪問(wèn)硬件設(shè)備,當(dāng)進(jìn)程需要直接訪問(wèn)硬件設(shè)備(比如讀取磁盤(pán)文件,接受網(wǎng)絡(luò)數(shù)據(jù)時(shí)),必須由用戶態(tài)模式切換至內(nèi)核態(tài)模式,通過(guò)系統(tǒng)調(diào)用訪問(wèn)硬件設(shè)備。strance可以追蹤到一個(gè)進(jìn)程產(chǎn)生的系統(tǒng)調(diào)用,包括參數(shù),返回值,執(zhí)行消耗的時(shí)間等等。

       同時(shí),strance是一個(gè)集診斷,調(diào)試,統(tǒng)計(jì)于一體的工具。我們可以使用strance對(duì)應(yīng)用的的系統(tǒng)調(diào)用和信號(hào)傳遞的跟蹤結(jié)果來(lái)對(duì)應(yīng)用進(jìn)行分析,以達(dá)到解決問(wèn)題或者是了解應(yīng)用工作過(guò)程的目的。


我們先來(lái)看看strace的命令都有哪些:

                                    strace常用命令學(xué)習(xí)

接下來(lái)我們通過(guò)一個(gè)打印“hello world”小程序來(lái)練習(xí)上面一些常用的選項(xiàng):

       strace常用命令學(xué)習(xí)

       從上面我們可以看到,當(dāng)我們用strace執(zhí)行test時(shí),系統(tǒng)首先調(diào)用execv函數(shù)開(kāi)始一個(gè)新的進(jìn)程,接著進(jìn)行一些環(huán)境初始化的一些操作,然后再調(diào)用write函數(shù)將“hello world”輸出到屏幕上,最后調(diào)用exit_group退出,就這樣完成整個(gè)程序的執(zhí)行過(guò)程。


用-s參數(shù)實(shí)現(xiàn)截?cái)噍敵觯?/p>

     -s參數(shù)用來(lái)指定trace的結(jié)果的每一行的輸出長(zhǎng)度,同樣還是上面的程序,我們看看加了-s參數(shù)后的變化:

       strace常用命令學(xué)習(xí)   

       從上面的結(jié)果我們可以看到,本來(lái)我們是要輸出“hello world”的,當(dāng)我們加上-s 選項(xiàng)之后,輸出了“hell”,實(shí)現(xiàn)了截?cái)唷?/p>


我們?cè)賮?lái)看看strace的跟蹤信號(hào)傳遞功能:

      我們這里還用上面的test程序,來(lái)觀察進(jìn)程接受信號(hào)的情況。我們先strace ./test,然后打開(kāi)另外一個(gè)窗口,輸入如下的命令 killall test,這時(shí)我們會(huì)看到程序退出了,結(jié)果如下:

      strace常用命令學(xué)習(xí)

     上面的現(xiàn)象可以體現(xiàn)出來(lái)用strace可以跟蹤進(jìn)程執(zhí)行時(shí)所接受的信號(hào)。


用-c參數(shù)還能將進(jìn)程所有的系統(tǒng)調(diào)用做一個(gè)統(tǒng)計(jì)分析,如下的現(xiàn)象:

      strace常用命令學(xué)習(xí)

     從上圖我們可以很清楚的知道我們執(zhí)行一個(gè)進(jìn)程時(shí),調(diào)用了哪些系統(tǒng)函數(shù),調(diào)用的次數(shù),消耗的時(shí)間等信息,這對(duì)我們分析一個(gè)程序來(lái)說(shuō)是非常有用的。


用-o選項(xiàng)實(shí)現(xiàn)重定向輸出:參數(shù)-o用于將strace的輸出重定向到文件中,如果不指定-o的話,默認(rèn)的輸出是stderr,格式是 -o filename,和使用2 > filename是一樣的。我們來(lái)看看:

    strace常用命令學(xué)習(xí)


       用-T選項(xiàng)可以打印出每個(gè)系統(tǒng)調(diào)用所花費(fèi)的時(shí)間,也就是每行最右邊的尖括號(hào)里面(我在圖中用紅顏色的框畫(huà)出來(lái)的)。這是一個(gè)很有用的功能,strace會(huì)將系統(tǒng)調(diào)用每次的時(shí)間記錄下來(lái),我們可以使用-t/tt/ttt看到,比如下面:

      strace常用命令學(xué)習(xí)

      我們來(lái)說(shuō)一下這三個(gè)參數(shù)的區(qū)別:-t 輸出結(jié)果精確到秒,-tt輸出結(jié)果精確到微秒,-ttt精確到微秒,而且時(shí)間表示為unix時(shí)間戳。


用-p追蹤一個(gè)現(xiàn)有的進(jìn)程,用法是 strace -p pid,我們看如下例子:

     strace常用命令學(xué)習(xí)

      我們的程度是先獲得進(jìn)程的id,并輸出“hello world”,然后sleep 30秒,在這期間,我們用strace追蹤該進(jìn)程,輸出上圖的信息,30秒后,進(jìn)程結(jié)束,死奧用seit_group函數(shù)。


用-e選項(xiàng)來(lái)進(jìn)行特定的系統(tǒng)調(diào)用(例如open,write)等:

        strace常用命令學(xué)習(xí)

      如上,我們我規(guī)定查看open的系統(tǒng)調(diào)用,并輸出了相應(yīng)的信息。


用-r參數(shù)展示系統(tǒng)調(diào)用之間的相對(duì)時(shí)間戳:

      strace常用命令學(xué)習(xí)

 

    其他選項(xiàng)的例子就不一一例舉了,以上幾個(gè)選項(xiàng)時(shí)比較常用的。











向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI