自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Linux服務器排障利器strace

系統(tǒng) Linux
strace是一個有用的小工具,它可以通過跟蹤系統(tǒng)調用來讓你知道一個程序在后臺所做的事情。Strace是一個基礎的調試工具,在大多數Linux系統(tǒng)上默認已經安裝;但是即便你不是在跟蹤一個問題的時候它也是一個極好的軟件。它能告訴你很多關于一個Linux程序怎樣工作的信息。

strace是一個有用的小工具,它可以通過跟蹤系統(tǒng)調用來讓你知道一個程序在后臺所做的事情。Strace是一個基礎的調試工具,在大多數Linux系統(tǒng)上默認已經安裝;但是即便你不是在跟蹤一個問題的時候它也是一個極好的軟件。它能告訴你很多關于一個Linux程序怎樣工作的信息。

一個系統(tǒng)調用就是一個從應用程序到內核的消息。現代計算機系統(tǒng)中的用戶程序都是運行在一個沙箱里面:它們不允許直接與計算機交互(因此你不能像以前那樣往寄存器里面塞一些數據來完成某些工作)。取而代之的是,每當程序需要與系統(tǒng)交互的時候,他就發(fā)送一個請求(系統(tǒng)調用)到內核。Strace就是用來跟蹤這些消息的。因此請記住,如果你有一會兒看不到任何strace的輸出,這也并不代表你的程序發(fā)生了阻塞。很有可能是程序在自己的沙箱里面做某些事情,而這些事情并不需要與系統(tǒng)的其它部分發(fā)生通信。

用法

Strace程序固然能做這些事情,但它總是直接將所有的東西輸出到標準錯誤文件(也就是屏幕)。就像你將看到的那樣,它會產生大量的輸出;因此通常來說你最好用-o選項來設置一個輸出文件:

strace -o outputfile.txt program

有一些編輯器(如vim)能夠對strace的輸出進行語法高亮顯示。這意味著文件的不同部分,以及每一行的不同部分都會用不同的顏色來顯示。這個功能相當有用,我強烈建議你使用一個這樣的編輯器來查看strace的輸出。

命令輸出解釋

試一試strace -o strace.out ls –l,然后用你喜歡的編輯器打開strace.out,并且啟用語法高亮。

在深入探索細節(jié)之前,先來看看每一行的基本結構。Strace記錄了程序所發(fā)出的每一次系統(tǒng)調用,并且各自顯示在單獨的一行中。系統(tǒng)調用的名字出現在每一行的起始,參數出現在括號里面,返回值則在等號后面,是一行的終結。命令ls –l的頭幾行輸出基本上是如下這個樣子:

execve("/bin/ls", ["ls", "-l"], [/* 21 vars */])      = 0
brk(0)                                                = 0x619000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b412f2b9000
uname({sys="Linux", node="juliet.example.com", ...})  = 0

第一行顯示的是一個execve的系統(tǒng)調用,其參數如下:

  1. 當前可執(zhí)行程序的位置 (/bin/ls)
  2. 一個從命令行傳遞過來的參數數組 (ls與-l)
  3. 一個指向21個環(huán)境變量的指針,也是傳遞給該程序的。

返回值為0,表示執(zhí)行成功。這就是所有系統(tǒng)調用都相同的基本結構。

所有在后臺的內幕

接下來的幾行跟內存管理有關。Brk改變數據段的大小,而mmap用來返回一個進程可用的內存位置。(如需要更多信息,請嘗試man 2 mmap。)

再下面一行是uname系統(tǒng)調用,用來顯示系統(tǒng)的詳細信息。Uname所返回的是一個指針,它指向存儲這些信息的一個數據結構。系統(tǒng)調用經常會返回指針:這是一個內存引用,告訴你到哪里去尋找這些信息。如果你是一臺計算機,這非常有用,但如果你是一個人就未必了;因此為了方便起見,每當__strace__看到一個指針的時候,它就自動幫你進行查找,然后返回(一部分)指針指向的內容。這正是上面在uname系統(tǒng)調用那里所發(fā)生的事情。

如果你繼續(xù)查看strace的輸出,你就會看到很多access和open的調用。Access查找一個文件(如果沒找到就返回-1和一個錯誤碼),然后檢查當前程序是否有訪問權限。Open試圖打開一個文件,如果成功的話就會將其連接到一個文件句柄(從3開始,因為0-2被用于STDIN、STDOUT和STDERR)并返回這個句柄。然后,fstat會獲取連接到該句柄的文件的有關信息,句柄通過第一個參數傳遞而來,就像這樣(注意第二個參數是一個指針?。?/p>

fstat(3, {st_mode=S_IFREG|0644, st_size=53482, ...}) = 0

在另一個mmap調用以后,文件將會被關閉。在ls的輸出中,你會看到這個序列在庫文件上面重復許多遍。而在那以后,對于每一個列出的文件還有l(wèi)stat、lgetxattr和getxattr等調用。這都是對每個文件獲取信息用的。最后,每個文件都會按這種方式寫到輸出文件:

stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=3661, ...}) = 0
write(1, "-rw-------  1 juliet juliet 10"..., 72) = 72

編號為1和2的文件句柄 (STDOUT和STDERR)將會關閉,于是一切都完成了。

結論

這只是一個關于閱讀strace輸出的非??焖俚慕榻B。要深入理解的話,最好的建議是去查看每個系統(tǒng)調用的手冊頁(man 2 <系統(tǒng)調用名>),并且嘗試著在各種程序中使用strace跟蹤輸出。在各種語言的‘Hello, World’程序上使用strace是一件非常有趣的事情。你還可以檢查某個已經在運行的程序,然后用strace的-p PID選項來實時連接到其中的某一個。祝你在使用strace深入解剖你的程序時其樂無窮!

【編輯推薦】

  1. 快速診斷Linux服務器故障的三大法寶
  2. 十大X86服務器常見故障——硬件篇
  3. 十大x86服務器常見故障——系統(tǒng)篇
責任編輯:yangsai 來源: 互聯網
相關推薦

2014-12-01 11:25:11

sysdigLinux

2010-08-27 10:18:24

DHCP服務

2010-08-05 14:29:54

NFS服務

2009-07-27 10:03:02

分層模型網絡故障

2010-03-17 15:35:47

2020-09-02 12:45:52

Linux排障運維

2020-10-24 15:31:10

Linux服務器工具

2013-07-25 09:56:22

OSPF路由選擇路由故障OSPF

2011-03-10 10:31:55

Linux服務器管理軟SUSE Manage

2010-07-15 11:16:04

負載均衡

2018-07-27 06:21:46

數據中心運維管理網絡設備

2013-12-03 16:28:06

2012-03-01 10:07:23

ARM服務器x86處理器服務器

2011-03-28 16:37:38

2010-09-08 14:56:06

nmon

2015-05-29 13:22:10

Linux掛載運維

2010-08-20 09:45:40

IOS升級排障

2014-08-06 11:25:00

LinuxSVN服務器

2022-05-05 09:27:31

Linux服務器優(yōu)化

2010-07-09 09:43:21

企業(yè)IT架構服務器管理
點贊
收藏

51CTO技術棧公眾號