核心探測工具systemtap簡介

2021-09-08 09:44:22 字數 2716 閱讀 1716

systemtap是核心開發者必須要掌握的乙個工具,本文我將簡單介紹一下此工具,後續將會有系列文章介紹systemtap的用法。

假如現在有這麼乙個需求:需要獲取正在執行的 linux 系統的資訊,如我想知道系統什麼時候發生系統呼叫,發生的是什麼系統呼叫等這些資訊,有什麼解決方案呢?

下面將會介紹systemtap的安裝、systemtap的工作原理以及幾個簡單的示例。

我的主機 linux 發行版是32位 ubuntu13.04,核心版本 3.8.0-30。由於 systemtap 執行需要核心的除錯資訊支撐,預設發行版的核心在配置時這些除錯開關沒有開啟,所以安裝完systemtap也是無法去探測核心資訊的。 下面我以兩種方式安裝並執行 systemtap:

編譯核心以支援systemtap 

我們重新編譯核心讓其支援systemtap,首先你想讓核心中有除錯資訊,編譯核心時需要加上 -g 標誌;其次,你還需要在配置核心時將 kprobe 和 debugfs 開關開啟。最終效果是,你能在核心 .config 檔案中看到下面四個選項是設定的:

config_debug_info

config_kprobes

config_debug_fs

config_relay

配置完之後,按照之前你編譯核心的步驟編譯即可。

git clone git:
./configure --with-elfutils=~/document/elfutils-0.156
以這裡方法配置之後,你只需要再執行make install即完成systemtap的編譯安裝。如果需要解除安裝的話,執行make uninstall

$ wget 

$ sudo dpkg -i linux-image-debug-3.8.0-30-generic_dbgsym_3.8.0-30.43_i386.ddeb

$sudo apt-get install systemtap
當然方法二僅限於ubuntu發行版,至於其他的發行版並不能照搬,網上也有很多相關的資料。

安裝完systemtap之後,我們需要測試一下systemtap是否能正確執行:

以root使用者或者具有sudo許可權的使用者執行以下命令:

$stap -ve 'probe begin '
如果安裝正確,會得到如下類似的輸出結果:

pass 1: parsed user script and 96 library script(s) using 55100virt/26224res/2076shr/25172data kb, in 120usr/0sys/119real ms.

pass 2: analyzed script: 1 probe(s), 2 function(s), 0 embed(s), 0 global(s) using 55496virt/27016res/2172shr/25568data kb, in 0usr/0sys/4real ms.

pass 3: translated to c into "/tmp/stapyqnuf9/stap_e2d1c1c9962c809ee9477018c642b661_939_src.c" using 55624virt/27380res/2488shr/25696data kb, in 0usr/0sys/0real ms.

pass 4: compiled c into "stap_e2d1c1c9962c809ee9477018c642b661_939.ko" in 1230usr/160sys/1600real ms.

pass 5: starting run.

hello systemtap!

pass 5: run completed in 0usr/10sys/332real ms.

建立systemtap指令碼檔案test2.stp:

#!/usr/bin/stap

probe begin

probe syscall.open

probe timer.ms(4000) # after 4 seconds

probe end

將該指令碼新增可執行的許可權chmod +x test2.stp,使用./test2.stp執行該指令碼,即可列印4s內所有open系統呼叫的資訊,列印格式為:程序名(程序號)開啟什麼檔案。 大家可以自行去測試,如果兩個示例都能正確執行,基本上算是安裝成功了!

systemtap 的核心思想是定義乙個事件(event),以及給出處理該事件的控制代碼(handler)。當乙個特定的事件發生時,核心執行該處理控制代碼,就像快速呼叫乙個子函式一樣,處理完之後恢復到核心原始狀態。這裡有兩個概念:

systemtap 工作原理是通過將指令碼語句翻譯成c語句,編譯成核心模組。模組載入之後,將所有探測的事件以鉤子的方式掛到核心上,當任何處理器上的某個事件發生時,相應鉤子上控制代碼就會被執行。最後,當systemtap會話結束之後,鉤子從核心上取下,移除模組。整個過程用乙個命令stap就可以完成。 上面只是簡單的原理,更多背後的機理參考網上資料和相應的**。

核心探測工具systemtap簡介

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

核心探測工具systemtap簡介

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

systemtap除錯核心

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