使用 SystemTap 除錯核心

2021-06-05 06:30:51 字數 3611 閱讀 1356

systemtap 是一種新穎的 linux 核心診斷工具,提供了一種從執行中的 linux 核心快速和安全地獲取資訊的能力。systemtap 是核心開發人員和系統管理員的福音,因為這使得他們可以通過編寫或者重用簡單的指令碼來收集核心的實時資料,而不需要再忍受修改原始碼、編譯核心、重啟系統的漫長煎熬。本文介紹了 systemtap 的安裝、使用和基本原理,並用一些有趣的例子揭示了 systemtap 提供的強大能力。
在 systemtap 出現之前,對於 linux 程式設計師或者系統管理員而言,除錯核心往往是一場噩夢。例如,你懷疑傳遞給系統呼叫 read 的引數 fd 出了問題,想把它列印出來,你需要做的是:首先得到乙份核心原始碼,找到 sys_read() 的函式體中插入 printk() 語句,接下來重新編譯核心,然後用新的核心重新啟動系統。謝天謝地,你總算看到了你想要看到的東西,不過你馬上會發現遇到了乙個新的麻煩:除非重新啟動系統到原來的核心,printk() 會無休止地列印下去。

systemtap 的目的就是要把人們從這種泥潭中解救出來。systemtap 提供了乙個簡單的命令列介面和強大的指令碼語言,同時預定義了豐富的指令碼庫。基於核心中的 kprobe,systemtap允許你自由地從執行中的核心無害地收集除錯資訊和效能資料,來用於之後的分析和處理。你可以隨時開始或者停止這種收集過程,而無需漫長的修改**、編譯核心和重啟系統的悲慘迴圈。systemtap 使得上面的問題變得簡單了,簡單得只需要一條命令就可以做到:

stap -e 'probe syscall.read 

systemtap的功能和sun的dtrace和ibm的dprobe工具相似。但是和它們不同的是, systemtap是遵循gpl的開源軟體專案。它的出現使得linux社群也擁有了功能強大而且易於使用的動態核心除錯工具。目前,systemtap 的主要開發成員來自於redhat、ibm、intel和hitachi,其中還包括來自ibm中國開發中心的工程師。

安裝systemtap

在安裝systemtap之前,需要確保系統中已經安裝了其它兩個軟體包:

接下來就可以安裝systemtap了,這有通過rpm或者原始碼安裝兩種方式:

core/updates/testing/6/i386/systemtap-0.5.10-1.fc6.i386.rpm

2.通過原始碼安裝:

然後安裝如下:

/root > tar -jxf systemtap-20061104.tar.bz2

/root > cd src

/root/src> ./configure

/root/src> make

/root/src> make install

執行systemtap

執行systemtap首先需要root許可權。

執行systemtap有三種形式:

1. 從檔案(通常以.stp作為檔名字尾)中讀入並執行指令碼:stap [選項] 檔名

2. 從標準輸入中讀入並執行指令碼: stap [選項] -

3. 執行命令列中的指令碼:stap [選項] -e 指令碼

4. 直接執行指令碼檔案(需要可執行屬性並且第一行加上#!/usr/bin/stap):./指令碼檔名使用"ctrl+c"中止systemtap的執行。

systemtap的選項還在不斷的擴充套件和更新中,其中最常用的選項包括:

-v -- 列印中間資訊

-p num -- 執行完pass num後停止(預設是執行到pass 5)

-k -- 執行結束後保留臨時檔案不刪除

-b -- 使用relayfs檔案系統來將資料從核心空間傳輸到使用者空間

-m -- 僅當使用-b選項時有效,執行結束時不合併每個cpu的單獨資料檔案

-o file -- 輸出到檔案,而不是輸出到標準輸出

-c cmd -- 啟動探測後,執行cmd命令,直到命令結束後退出

-g -- 採用guru模式,允許指令碼中嵌入c語句

其它更多選項請參看stap的手冊。

systemtap的語法

我們利用乙個簡單的systemtap指令碼來介紹一下systemtap的語法:

#!/usr/local/bin/stap

global count

function report(stat)

probe kernel.function("sys_read")

probe end

systemtap的例子

了解了systemtap的基本用法,下面讓我們來看幾個有趣的例子。

統計當前系統中呼叫最多的前10個系統呼叫

在進行效能分析的時候,我們常常需要知道那些函式呼叫次數最多,才能有的放矢地展開分析。下面這個簡單的例子可以列印出在過去的5秒鐘裡呼叫次數最多的那些系統呼叫。

#!/usr/bin/env stap

## display the top 10 syscalls called in last 5 seconds

#global syscalls

function print_top ()

printf("--------------------------------------\n")

delete syscalls

}probe syscall.*

probe timer.ms(5000)

它的輸出結果一目了然:

看看是誰在偷偷動我的檔案

有時候,我們如果中了惡意的病毒軟體,會發現某些檔案莫名其妙的被修改,下面這個例子可以幫你監視誰在修改你的檔案。

#!/usr/bin/env stap

## monitor who is messing my file of secrets

#probe generic.fop.open

我們執行這個指令碼,在另外乙個視窗做一些操作,來看看它的輸出結果:

列印ansi字串

systemtap不僅僅是乙個簡單的除錯工具,強大的指令碼語言能力讓它同樣能做一些有趣的事情,下面這個例子就可以對輸出的字元進行美化:

#!/usr/bin/env stap

## print colorful ansi strings

#probe begin

exit();

}

來看看它的輸出:

systemtap的基本原理

現在,大家已經熟悉了systemtap的基本用法。在結束之前,讓我們再來了解一下systemtap的基本原理和工作流程以加深理解。

可以看出,systemtap執行的過程依次分為五個階段,通常稱為pass 1 - pass 5。就像前面介紹用法的時候提到的,在命令列中加上-p num選項可以使得systemtap在執行完pass num之後停止,而不是執行到pass 5。這允許你分析systemtap在每乙個階段的輸出,對於除錯指令碼尤其有用。

下面來介紹每乙個階段的主要功能: 小結

systemtap是乙個全新的工具,但已經表現出了強大的功能和廣泛的適用性。systemtap使得動態收集linux核心資訊和效能資料變得輕而易舉,這就使人可以從繁瑣的資料採集中解放出來,而專注於資料的處理和分析,這無疑是核心開發人員和系統管理人員的福音。隨著越來越多使用者的體驗,越來越多的bug會被報告和修正,越來越多的新功能會被新增,systemtap也會變得越來越穩定和完善。

使用 SystemTap 除錯核心

systemtap 是一種新穎的 linux 核心診斷工具,提供了一種從執行中的 linux 核心快速和安全地獲取資訊的能力。systemtap 是核心開發人員和系統管理員的福音,因為這使得他們可以通過編寫或者重用簡單的指令碼來收集核心的實時資料,而不需要再忍受修改原始碼 編譯核心 重啟系統的漫長煎...

systemtap除錯核心

systemtap是核心開發者必須要掌握的乙個工具,本文我將簡單介紹一下此工具,後續將會有系列文章介紹systemtap的用法。假如現在有這麼乙個需求 需要獲取正在執行的 linux 系統的資訊,如我想知道系統什麼時候發生系統呼叫,發生的是什麼系統呼叫等這些資訊,有什麼解決方案呢?下面將會介紹sys...

systemtap安裝 核心除錯環境配置

參考其官網 我是在ubuntu下安裝的,所以轉至這個網頁 systemtaponubuntu 參考網頁 1.systemtap的安裝 systemtap的安裝是很簡單的,一條命令足以 sudo apt get install systemtap 此時,你執行如下測試命令 sudo stap ve p...