安裝SystemTap(ubuntu10.10)
簡便的安裝方式通過下面指令直接下載下傳并安裝在系統裡:
# sudo apt-get install systemtap
也可以去
http://sourceware.org/systemtap/getinvolved.html下載下傳各種版本的systemtap。
具體的安裝說明可以參考官網上的指導:
http://sourceware.org/git/?p=systemtap.git;a=blob_plain;f=README;hb=HEAD我參考的是一篇技術部落格:
http://www.ningoo.net/html/2010/use_systemtap_on_ubuntu.htmlUbuntu Desktop預設沒有安裝kernel debug info的包,systemtap無法追蹤核心資訊。檢視核心版本:
# uname –r
在
http://archive.ubuntu.com/ubuntu/pool/main/l/linux/?C=S;O=A下載下傳對應的kernel debug info包
在網上下載下傳不到linux-image-2.6.35-22-generic-dbgsym_2.6.35-22.35_i386.ddeb這個調試包,隻用2.6.32和2.6.38版本的,是以我在vbox虛拟機上安裝了ubuntu10.04(下載下傳位址:
http://www.ubuntu.com/download/ubuntu/download),其核心版本是:2.6.32-33-generic
http://ddebs.ubuntu.com/pool/main/l/linux/位址可以下載下傳到對應的kernel debug info
注意下載下傳調試包的時候注意後面的小号也要一緻!用# uname –a來檢視小号!

根據systemtap的文法規則,我嘗試了一些指令的編寫,可以編寫個腳本對檔案進行監測:
# sudo stap ‘probegeneric.fop.open { if(filename == "secrets") printf("%s isopening my file: %s\n", execname(), filename) }’
先運作上面監測指令,當打開secrets檔案時,終端上将顯示對檔案的操作!
# sudo stap –ve ‘probebegin { printf("a \\ b "); for (c = 40; c < 48; c++) printf("%d ", c); printf("\12"); for (l = 0; l < 71; l++)printf("-"); printf("\12"); for (r = 30; r < 38; r++)for (t = 0; t < 2; t++) { printf("%d ", r); for (c = 40; c <48; c++)
printf("\033[%d;%d%s %s \033[0;0m", r, c, !t ? "m": ";1m", !t ? "Normal" : "Bold ");printf("\12"); } exit(); }’
SystemTap不僅僅是一個簡單的調試工具,強大的腳本語言能力讓它同樣能做一些有趣的事情,下面這個例子就可以對輸出的字元進行美化:
在進行性能分析的時候,我們常常需要知道那些函數調用次數最多,才能有的放矢地展開分析。下面這個簡單的例子可以列印出在過去的5秒鐘裡調用次數最多的那些系統調用。
# sudo stap -ve'global syscalls function print_top () { cnt=0 log("SYSCALL\t\t\t\tCOUNT") foreach ([name] in syscalls-) {printf("%-20s\t\t%5d\n",name, syscalls[name]) if (cnt++ == 10) break} printf("--------------------------------------\n") delete syscalls}
probe syscall.* { syscalls[probefunc()]++ } probe timer.ms(5000) { print_top() }'
小結:
在運作幾個腳本後,我逐漸發現systemtap之是以受linux程式員的歡迎,是因為當你需要列印出某個函數的參數時,不再需要在核心源碼中重新插入一行輸出代碼,然後重新編譯核心才能看到想要輸出的結果。有了systemtap可以通過編寫一些腳本檔案(.stp)自由的收集調試資訊和性能資料,無需修改核心代碼和漫長的核心代碼編譯了。
經過幾個測試,開始了解了systemtap的基本工作原理,下面簡單說下5個pass的作用:
Pass 1 - parse:這個階段主要是檢查輸入腳本是否存在文法錯誤,例如大括号是否比對,變量定義是否規範等
Pass 2 - elaborate:這個階段主要是對輸入腳本中定義的探測點或者用到的函數展開,不但需要綜合SystemTap的預定義腳本庫,還需要分析核心或者核心子產品的調試資訊
Pass 3 -translate: 在這個階段,将展開後的腳本轉換成C檔案。前三個階段的功能類似于編譯器,将.stp檔案編譯成為完整的.c檔案,是以又被合起來稱為轉換器(translator)
Pass 4 - build:在這個階段,将C源檔案編譯成核心子產品,在這過程中還會用到SystemTap的運作時庫函數。
Pass 5 - run:這個階段,将編譯好的核心子產品插入核心,開始進行資料收集和傳輸。