使用 SystemTap 除錯核心

2021-04-12 19:59:33 字數 2690 閱讀 2992

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或者原始碼安裝兩種方式:

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 指令碼

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)

它的輸出結果一目了然:

桂劍,ibm 中國開發中心 linux performance 專案的軟體工程師,有五年的 linux 開發經驗,對編譯器、除錯技術、作業系統很感興趣。

使用 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...