亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.430618.com 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

在 Linux 上用 strace 來理解系統(tǒng)調(diào)用

 

使用 strace 跟蹤用戶進(jìn)程和 linux 內(nèi)核之間的交互。-- Gaurav Kamathe(作者)

系統(tǒng)調(diào)用(system call)是程序從內(nèi)核請(qǐng)求服務(wù)的一種編程方式,而 strace 是一個(gè)功能強(qiáng)大的工具,可讓你跟蹤用戶進(jìn)程與 Linux 內(nèi)核之間的交互。

要了解操作系統(tǒng)的工作原理,首先需要了解系統(tǒng)調(diào)用的工作原理。操作系統(tǒng)的主要功能之一是為用戶程序提供抽象機(jī)制。

操作系統(tǒng)可以大致分為兩種模式:

  • 內(nèi)核模式:操作系統(tǒng)內(nèi)核使用的一種強(qiáng)大的特權(quán)模式
  • 用戶模式:大多數(shù)用戶應(yīng)用程序運(yùn)行的地方 用戶大多使用命令行實(shí)用程序和圖形用戶界面(GUI)來執(zhí)行日常任務(wù)。系統(tǒng)調(diào)用在后臺(tái)靜默運(yùn)行,與內(nèi)核交互以完成工作。

系統(tǒng)調(diào)用與函數(shù)調(diào)用非常相似,這意味著它們都接受并處理參數(shù)然后返回值。唯一的區(qū)別是系統(tǒng)調(diào)用進(jìn)入內(nèi)核,而函數(shù)調(diào)用不進(jìn)入。從用戶空間切換到內(nèi)核空間是使用特殊的 trap 機(jī)制完成的。

通過使用系統(tǒng)庫(在 Linux 系統(tǒng)上又稱為 glibc),大部分系統(tǒng)調(diào)用對(duì)用戶隱藏了。盡管系統(tǒng)調(diào)用本質(zhì)上是通用的,但是發(fā)出系統(tǒng)調(diào)用的機(jī)制在很大程度上取決于機(jī)器(架構(gòu))。

本文通過使用一些常規(guī)命令并使用 strace 分析每個(gè)命令進(jìn)行的系統(tǒng)調(diào)用來探索一些實(shí)際示例。這些示例使用 Red Hat Enterprise Linux,但是這些命令運(yùn)行在其他 Linux 發(fā)行版上應(yīng)該也是相同的:

首先,確保在系統(tǒng)上安裝了必需的工具。你可以使用下面的 rpm 命令來驗(yàn)證是否安裝了 strace。如果安裝了,則可以使用 -V 選項(xiàng)檢查 strace 實(shí)用程序的版本號(hào):

如果沒有安裝,運(yùn)行命令安裝:

出于本示例的目的,在 /tmp 中創(chuàng)建一個(gè)測(cè)試目錄,并使用 touch 命令創(chuàng)建兩個(gè)文件:

(我使用 /tmp 目錄是因?yàn)槊總€(gè)人都可以訪問它,但是你可以根據(jù)需要選擇另一個(gè)目錄。)

在 testdir 目錄下使用 ls 命令驗(yàn)證該文件已經(jīng)創(chuàng)建:

你可能每天都在使用 ls 命令,而沒有意識(shí)到系統(tǒng)調(diào)用在其下面發(fā)揮的作用。抽象地來說,該命令的工作方式如下:

命令行工具 -> 從系統(tǒng)庫(glibc)調(diào)用函數(shù) -> 調(diào)用系統(tǒng)調(diào)用

ls 命令內(nèi)部從 Linux 上的系統(tǒng)庫(即 glibc)調(diào)用函數(shù)。這些庫去調(diào)用完成大部分工作的系統(tǒng)調(diào)用。

如果你想知道從 glibc 庫中調(diào)用了哪些函數(shù),請(qǐng)使用 ltrace 命令,然后跟上常規(guī)的 ls testdir/命令:

如果沒有安裝 ltrace,鍵入如下命令安裝:

大量的輸出會(huì)被堆到屏幕上;不必?fù)?dān)心,只需繼續(xù)就行。ltrace 命令輸出中與該示例有關(guān)的一些重要庫函數(shù)包括:

通過查看上面的輸出,你或許可以了解正在發(fā)生的事情。opendir 庫函數(shù)打開一個(gè)名為 testdir 的目錄,然后調(diào)用 readdir 函數(shù),該函數(shù)讀取目錄的內(nèi)容。最后,有一個(gè)對(duì) closedir 函數(shù)的調(diào)用,該函數(shù)將關(guān)閉先前打開的目錄。現(xiàn)在請(qǐng)先忽略其他 strlen 和 memcpy 功能。

你可以看到正在調(diào)用哪些庫函數(shù),但是本文將重點(diǎn)介紹由系統(tǒng)庫函數(shù)調(diào)用的系統(tǒng)調(diào)用。

與上述類似,要了解調(diào)用了哪些系統(tǒng)調(diào)用,只需將 strace 放在 ls testdir 命令之前,如下所示。 再次,一堆亂碼丟到了你的屏幕上,你可以按照以下步驟進(jìn)行操作:

運(yùn)行 strace 命令后屏幕上的輸出就是運(yùn)行 ls 命令的系統(tǒng)調(diào)用。每個(gè)系統(tǒng)調(diào)用都為操作系統(tǒng)提供了特定的用途,可以將它們大致分為以下幾個(gè)部分:

  • 進(jìn)程管理系統(tǒng)調(diào)用
  • 文件管理系統(tǒng)調(diào)用
  • 目錄和文件系統(tǒng)管理系統(tǒng)調(diào)用
  • 其他系統(tǒng)調(diào)用

分析顯示到屏幕上的信息的一種更簡(jiǎn)單的方法是使用 strace 方便的 -o 標(biāo)志將輸出記錄到文件中。在 -o 標(biāo)志后添加一個(gè)合適的文件名,然后再次運(yùn)行命令:

這次,沒有任何輸出干擾屏幕顯示,ls 命令如預(yù)期般工作,顯示了文件名并將所有輸出記錄到文件 trace.log 中。僅僅是一個(gè)簡(jiǎn)單的 ls 命令,該文件就有近 100 行內(nèi)容:

讓我們看一下這個(gè)示例的 trace.log 文件的第一行:

  • 該行的第一個(gè)單詞 execve 是正在執(zhí)行的系統(tǒng)調(diào)用的名稱。
  • 括號(hào)內(nèi)的文本是提供給該系統(tǒng)調(diào)用的參數(shù)。
  • 符號(hào) = 后的數(shù)字(在這種情況下為 0)是 execve 系統(tǒng)調(diào)用的返回值。

現(xiàn)在的輸出似乎還不太嚇人,對(duì)吧。你可以應(yīng)用相同的邏輯來理解其他行。

現(xiàn)在,將關(guān)注點(diǎn)集中在你調(diào)用的單個(gè)命令上,即 ls testdir。你知道命令 ls 使用的目錄名稱,那么為什么不在 trace.log 文件中使用 grep 查找 testdir 并查看得到的結(jié)果呢?讓我們?cè)敿?xì)查看一下結(jié)果的每一行:

回顧一下上面對(duì) execve 的分析,你能說一下這個(gè)系統(tǒng)調(diào)用的作用嗎?

你無需記住所有系統(tǒng)調(diào)用或它們所做的事情,因?yàn)槟憧梢栽谛枰獣r(shí)參考文檔。手冊(cè)頁可以解救你!在運(yùn)行 man 命令之前,請(qǐng)確保已安裝以下軟件包:

請(qǐng)記住,你需要在 man 命令和系統(tǒng)調(diào)用名稱之間添加 2。如果使用 man man 閱讀 man 命令的手冊(cè)頁,你會(huì)看到第 2 節(jié)是為系統(tǒng)調(diào)用保留的。同樣,如果你需要有關(guān)庫函數(shù)的信息,則需要在 man 和庫函數(shù)名稱之間添加一個(gè) 3。

以下是手冊(cè)的章節(jié)編號(hào)及其包含的頁面類型:

  • 1:可執(zhí)行的程序或 shell 命令
  • 2:系統(tǒng)調(diào)用(由內(nèi)核提供的函數(shù))
  • 3:庫調(diào)用(在程序的庫內(nèi)的函數(shù))
  • 4:特殊文件(通常出現(xiàn)在 /dev)

使用系統(tǒng)調(diào)用名稱運(yùn)行以下 man 命令以查看該系統(tǒng)調(diào)用的文檔:

按照 execve 手冊(cè)頁,這將執(zhí)行在參數(shù)中傳遞的程序(在本例中為 ls)。可以為 ls 提供其他參數(shù),例如本例中的 testdir。因此,此系統(tǒng)調(diào)用僅以 testdir 作為參數(shù)運(yùn)行 ls:

下一個(gè)系統(tǒng)調(diào)用,名為 stat,它使用 testdir 參數(shù):

使用 man 2 stat 訪問該文檔。stat 是獲取文件狀態(tài)的系統(tǒng)調(diào)用,請(qǐng)記住,Linux 中的一切都是文件,包括目錄。

接下來,openat 系統(tǒng)調(diào)用將打開 testdir。密切注意返回的 3。這是一個(gè)文件描述符,將在以后的系統(tǒng)調(diào)用中使用:

到現(xiàn)在為止一切都挺好。現(xiàn)在,打開 trace.log 文件,并轉(zhuǎn)到 openat 系統(tǒng)調(diào)用之后的行。你會(huì)看到 getdents 系統(tǒng)調(diào)用被調(diào)用,該調(diào)用完成了執(zhí)行 ls testdir 命令所需的大部分操作。現(xiàn)在,從 trace.log 文件中用 grep 獲取 getdents:

getdents 的手冊(cè)頁將其描述為 “獲取目錄項(xiàng)”,這就是你要執(zhí)行的操作。注意,getdents 的參數(shù)是 3,這是來自上面 openat 系統(tǒng)調(diào)用的文件描述符。

現(xiàn)在有了目錄列表,你需要一種在終端中顯示它的方法。因此,在日志中用 grep 搜索另一個(gè)用于寫入終端的系統(tǒng)調(diào)用 write:

在這些參數(shù)中,你可以看到將要顯示的文件名:file1 和 file2。關(guān)于第一個(gè)參數(shù)(1),請(qǐng)記住在 Linux 中,當(dāng)運(yùn)行任何進(jìn)程時(shí),默認(rèn)情況下會(huì)為其打開三個(gè)文件描述符。以下是默認(rèn)的文件描述符:

  • 0:標(biāo)準(zhǔn)輸入
  • 1:標(biāo)準(zhǔn)輸出
  • 2:標(biāo)準(zhǔn)錯(cuò)誤

因此,write 系統(tǒng)調(diào)用將在標(biāo)準(zhǔn)顯示(就是這個(gè)終端,由 1 所標(biāo)識(shí)的)上顯示 file1 和 file2。

現(xiàn)在你知道哪個(gè)系統(tǒng)調(diào)用完成了 ls testdir/ 命令的大部分工作。但是在 trace.log 文件中其它的 100 多個(gè)系統(tǒng)調(diào)用呢?操作系統(tǒng)必須做很多內(nèi)務(wù)處理才能運(yùn)行一個(gè)進(jìn)程,因此,你在該日志文件中看到的很多內(nèi)容都是進(jìn)程初始化和清理。閱讀整個(gè) trace.log 文件,并嘗試了解 ls 命令是怎么工作起來的。

既然你知道了如何分析給定命令的系統(tǒng)調(diào)用,那么就可以將該知識(shí)用于其他命令來了解正在執(zhí)行哪些系統(tǒng)調(diào)用。strace 提供了許多有用的命令行標(biāo)志,使你更容易使用,下面將對(duì)其中一些進(jìn)行描述。

默認(rèn)情況下,strace 并不包含所有系統(tǒng)調(diào)用信息。但是,它有一個(gè)方便的 -v 冗余選項(xiàng),可以在每個(gè)系統(tǒng)調(diào)用中提供附加信息:

在運(yùn)行 strace 命令時(shí)始終使用 -f 選項(xiàng)是一種好的作法。它允許 strace 對(duì)當(dāng)前正在跟蹤的進(jìn)程創(chuàng)建的任何子進(jìn)程進(jìn)行跟蹤:

假設(shè)你只需要系統(tǒng)調(diào)用的名稱、運(yùn)行的次數(shù)以及每個(gè)系統(tǒng)調(diào)用花費(fèi)的時(shí)間百分比。你可以使用 -c 標(biāo)志來獲取這些統(tǒng)計(jì)信息:

假設(shè)你想專注于特定的系統(tǒng)調(diào)用,例如專注于 open 系統(tǒng)調(diào)用,而忽略其余部分。你可以使用-e 標(biāo)志跟上系統(tǒng)調(diào)用的名稱:

如果你想關(guān)注多個(gè)系統(tǒng)調(diào)用怎么辦?不用擔(dān)心,你同樣可以使用 -e 命令行標(biāo)志,并用逗號(hào)分隔開兩個(gè)系統(tǒng)調(diào)用的名稱。例如,要查看 write 和 getdents 系統(tǒng)調(diào)用:

到目前為止,這些示例是明確地運(yùn)行的命令進(jìn)行了跟蹤。但是,要跟蹤已經(jīng)運(yùn)行并正在執(zhí)行的命令又怎么辦呢?例如,如果要跟蹤用來長(zhǎng)時(shí)間運(yùn)行進(jìn)程的守護(hù)程序,該怎么辦?為此,strace 提供了一個(gè)特殊的 -p 標(biāo)志,你可以向其提供進(jìn)程 ID。

我們的示例不在守護(hù)程序上運(yùn)行 strace,而是以 cat 命令為例,如果你將文件名作為參數(shù),通常 cat 會(huì)顯示文件的內(nèi)容。如果沒有給出參數(shù),cat 命令會(huì)在終端上等待用戶輸入文本。輸入文本后,它將重復(fù)給定的文本,直到用戶按下 Ctrl + C 退出為止。

從一個(gè)終端運(yùn)行 cat 命令;它會(huì)向你顯示一個(gè)提示,并等待在那里(記住 cat 仍在運(yùn)行且尚未退出):

在另一個(gè)終端上,使用 ps 命令找到進(jìn)程標(biāo)識(shí)符(PID):

現(xiàn)在,使用 -p 標(biāo)志和 PID(在上面使用 ps 找到)對(duì)運(yùn)行中的進(jìn)程運(yùn)行 strace。運(yùn)行 strace 之后,其輸出說明了所接駁的進(jìn)程的內(nèi)容及其 PID。現(xiàn)在,strace 正在跟蹤 cat 命令進(jìn)行的系統(tǒng)調(diào)用。看到的第一個(gè)系統(tǒng)調(diào)用是 read,它正在等待文件描述符 0(標(biāo)準(zhǔn)輸入,這是運(yùn)行 cat 命令的終端)的輸入:

現(xiàn)在,返回到你運(yùn)行 cat 命令的終端,并輸入一些文本。我出于演示目的輸入了 x0x0。注意 cat 是如何簡(jiǎn)單地重復(fù)我輸入的內(nèi)容的。因此,x0x0 出現(xiàn)了兩次。我輸入了第一個(gè),第二個(gè)是 cat 命令重復(fù)的輸出:

返回到將 strace 接駁到 cat 進(jìn)程的終端。現(xiàn)在你會(huì)看到兩個(gè)額外的系統(tǒng)調(diào)用:較早的 read 系統(tǒng)調(diào)用,現(xiàn)在在終端中讀取 x0x0,另一個(gè)為 write,它將 x0x0 寫回到終端,然后是再一個(gè)新的 read,正在等待從終端讀取。請(qǐng)注意,標(biāo)準(zhǔn)輸入(0)和標(biāo)準(zhǔn)輸出(1)都在同一終端中:

想象一下,對(duì)守護(hù)進(jìn)程運(yùn)行 strace 以查看其在后臺(tái)執(zhí)行的所有操作時(shí)這有多大幫助。按下 Ctrl + C 殺死 cat 命令;由于該進(jìn)程不再運(yùn)行,因此這也會(huì)終止你的 strace 會(huì)話。

如果要查看所有的系統(tǒng)調(diào)用的時(shí)間戳,只需將 -t 選項(xiàng)與 strace 一起使用:

如果你想知道兩次系統(tǒng)調(diào)用之間所花費(fèi)的時(shí)間怎么辦?strace 有一個(gè)方便的 -r 命令,該命令顯示執(zhí)行每個(gè)系統(tǒng)調(diào)用所花費(fèi)的時(shí)間。非常有用,不是嗎?

總結(jié)

strace 實(shí)用程序非常有助于理解 Linux 上的系統(tǒng)調(diào)用。要了解它的其它命令行標(biāo)志,請(qǐng)參考手冊(cè)頁和在線文檔。


via: https://opensource.com/article/19/10/strace

作者: Gaurav Kamathe 選題: lujun9972 譯者: wxy 校對(duì): wxy

本文由 LCTT 原創(chuàng)編譯, Linux中國 榮譽(yù)推出

分享到:
標(biāo)簽:strace
用戶無頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定