systemtap系列之SYSTEMTAP介紹

2021-09-19 20:01:10 字數 2307 閱讀 3229

systemtap系列之systemtap介紹

systemtap是乙個診斷linux系統效能或功能問題的開源軟體。它使得對執行時的linux系統進行診斷調式變得更容易、更簡單。有了它,開發者或除錯人員不再需要重編譯、安裝新核心、重啟動等煩人的步驟。

2      systemtap原理

systemtap使用了類似於awk和c語言的指令碼語言(類似於dtrace的d語言),只使用了三種資料型別,整數(integers)、字串(strings)以及關聯陣列(associative arrays),它有完整的控制結構,包括塊(blocks)、條件(conditionals)、迴圈(loops)和函式(functions)。語句分割符;是可選的,變數不需要宣告型別,它們是根據上下文自動推測和檢查的,它使用了kprobe提供的介面來實現探測,對於每乙個探測,需要定義探測點以及相應的處理函式,探測點就是指kprobe中被探測的函式或指令位址(也被稱為核心事件)的),但在systemtap中,使用者可以指定原檔案,原**的某一行,或者乙個非同步事件,如週期性的定時器,探測點使用了層次化的命名方式,探測點處理函式能夠立刻輸出資料,與printk很類似,它也能檢視核心資料。指令碼然後被乙個翻譯器轉換成c**並編譯成乙個核心模組。探測點根據核心的dwarf除錯資訊對映到核心的虛位址(因此systemtap要求使用者必須準備好可用的核心除錯資訊),所有的指令碼內容在轉換時進行嚴格的檢查,並且在執行時也要檢查(如無限迴圈、記憶體使用、遞迴和無效指標等),因此有好的安全性,不會影響正在執行的系統(這對生產系統是非常重要的)。 systemtap包含了乙個黑名單,其中列出的函式不能被systemtap探測,因為它們會導致無限探測迴圈、鎖重入等問題。

圖 1.systemtap工作原理

systemtap指令碼檔案是.stp字尾的檔案,使用的指令碼語言是前面講到的systemtap自己定義的指令碼語言,乙個systemtap指令碼描述了將要探測的探測點以及定義了相關聯的處理函式,每乙個探測點對應於乙個核心函式或事件或函式內部的某一位置。被關聯的處理函式將在核心執行到對應的探測點時被執行。

tapsets是乙個指令碼庫,包含了許多tapset,每乙個tapset一般為某一核心子系統或特定的功能塊預定義了一套探測點、輔助函式或全域性變數供使用者指令碼或其它的tapset引用,它定義的一些資料能夠被每乙個探測點處理函式或指令碼使用,這些資料通常通過使用處理函式語句塊(hsb handler statement block)來出口,hsb語句塊中的變數就是被出口的資料。tapset一般由該核心子系統的開發者或對子系統非常了解的開發者編寫,既使用了指令碼語言,也使用了c語言,並且它已經被測試和驗證,可以安全使用。tapsets屬於systemtap發行包的一部分。

systemtap實現了乙個指令碼轉換器/翻譯器,當使用者執行乙個systemtap指令碼時,systemtap將首先對它進行分析和一些安全檢查,如果它引用了systemtap預定義的指令碼庫提供的函式,systemtap也將讀取指令碼庫得到相應的**,對於一些核心變數或符號的引用,它必須根據核心除錯資訊來解析到相應的位址。然後,它被轉換成c**,在這個轉換中,systemtap將根據需要增加必要的鎖和安全檢查**。探測點之間共享的變數將被轉換成恰當的靜態宣告並有鎖保護,每組本地變數被轉換到乙個合成的呼叫幀結構中以避免消耗核心的棧空間。關聯到探測點的處理函式被封裝成乙個介面函式,那呼叫恰當的kprobe介面函式來註冊該探測點。

產生的c**包含了一些對執行時tapset的引用,執行時tapset庫提供了許多systemtap介面函式,如通用的查詢表、受限記憶體管理、啟動、關閉、i/o操作以及其它一些函式。生成的c**編譯鏈結之後生成乙個可載入的核心模組。為了快速得到執行結果,systemtap使用了relayfs,當載入生成的核心模組後,該模組的初始化函式初始化自身,然後呼叫kprobe介面函式註冊指令碼中定義的探測點。當核心執行到註冊的探測點時,相應的處理函式被呼叫,使用者在處理函式中的輸出語句將呼叫relayfs介面函式輸出結果資料,使用者在處理函式也可以呼叫一些核心的效能測量函式。當使用者主動停止或指令碼設定的條件滿足時,模組將呼叫退出函式解除安裝已經註冊的探測點並做一些清理處理就解除安裝模組自身。

systemtap在執行時啟動了乙個程序,它專門負責通過relayfs讀去模組的輸出資料並即時地輸出給使用者。

3      安裝

安裝非常方便

#yuminstall systemtap

4      簡單例子

**如下:

#!/usr/bin/stap

probebegin

probesyscall.open

probetimer.ms(4000) # after 4 seconds

probe end

使用 #stapopen.stp 開始執行。

--------------------- 

由作者從csdn中搬遷至此

systemtap系列之SYSTEMTAP介紹

systemtap系列之systemtap介紹 systemtap是乙個診斷linux系統效能或功能問題的開源軟體。它使得對執行時的linux系統進行診斷調式變得更容易 更簡單。有了它,開發者或除錯人員不再需要重編譯 安裝新核心 重啟動等煩人的步驟。2 systemtap原理 systemtap使用...

python之sys模組詳解

sys模組功能多,我們這裡介紹一些比較實用的功能,相信你會喜歡的,和我一起走進python的模組吧!功能 在外部向程式內部傳遞引數 示例 sys.py usr bin env python import sys print sys.argv 0 print sys.argv 1 執行 python ...

Python資料之sys模組

1 sys.argv 命令列引數list,第乙個元素是程式本身路徑 指令碼內容 demo.py import sys print sys.argv 執行結果 d python3.5 python demo.py arg1 agr2 agr3 demo.py arg1 agr2 agr3 2 sys....