systemtap概述及例項

2021-08-20 12:57:33 字數 2783 閱讀 4228

systemtap對使用者級和核心級**提供了靜態和動態跟蹤的功能。systemtap採用其他的核心框架做源:靜態探針用tracepoints、動態探針用kprobes、使用者級別的探針用uprobes。這些源也為perf、lttng所用。

由於 systemtap 執行需要核心的除錯資訊支撐,預設發行版的核心在配置時這些除錯開關沒有開啟,所以安裝完systemtap也是無法去探測核心資訊的。

systemtap 工作原理是通過將指令碼語句翻譯成c語句,編譯成核心模組。模組載入之後,將所有探測的事件以鉤子的方式掛到核心上,當任何處理器上的某個事件發生時,相應鉤子上控制代碼就會被執行。最後,當systemtap會話結束之後,鉤子從核心上取下,移除模組。

工作原理如下圖:

安裝分為兩部分:一部分為是systemtap工具本身,另一部分是核心除錯資訊。

在ubuntu中使用apt-get install systemtap命令進行安裝。

因為systemtap需要核心資訊來防止指令,所以需要安裝debug info,先通過命令uname -r檢視核心版本,然後安裝linux-image-[uname –r]-dbgsym。

ubuntu參考:

或者直接執行stap-prep命令來進行安裝。

wget 

chmod +x get-dbgsym

sudo ./get-dbgsy

另外,例項指令碼位於:/usr/share/systemtap/tapset中。

編譯完核心後,執行如下命令:

#ln -s /kernel/linux-4.15.15/vmlinux /boot/vmlinux-`uname -r`

#ln -s /lib/modules/`uname -r` /usr/lib/debug/lib/modules/`uname -r`

#cd /usr/lib/debug/lib/modules/`uname -r`

然後執行如下指令碼:

for file in `find -name '*.ko' -print`

dobuildid=`eu-readelf -n $file| grep build.id: | awk ''`

dir=`echo $buildid | cut -c1-2`

fn=`echo $buildid | cut -c3-`

mkdir -p /usr/lib/debug/.build-id/$dir

ln -s $file /usr/lib/debug/.build-id/$dir/$fn

ln -s $file /usr/lib/debug/.build-id/$dir/$.debug

done

探針的定義由句號分隔。示例如下:

begin:程式開始

end:程式開始

syscall.read: 系統呼叫read()的開始

syscall.read.return:系統呼叫read()的結束。

kernel.function(「sys_read」):核心函式sys_read()的開始

kernel.function(「sys_read」).return:核心函式sys_read的結束

socket.send:傳送包

timer.ms(100):每100ms觸發一次探針

timer.profile:按核心時鐘頻率對所有的cpu都觸發的探針,用於取樣/剖析。

process(「a.out」).statement(*@main.c:100): 跟蹤目標程序,可執行檔案a.out,main.c的100行。

一組相關的探針被稱為tapset。

syscall:系統呼叫

ioblock:塊裝置介面和io排程器

scheduler:核心cpu排程器事件

memory:程序和虛擬記憶體使用

scsi:scsi目標事件

networking:網路裝置事件

tcp:tcp協議事件

socket:套接字事件

此外systemtap還提供了許多action和內建變數,例如execname()獲取程序名,pid()獲取當前程序id,print_backtrace()列印核心棧的回溯資訊。

systemtap 在編譯階段會消耗cpu資源。也可以在不同的系統上編譯systemtap程式,然後將快取結果傳輸給目標系統。

執行如下**:

# stap -ve 'probe begin '

建立open.stp**如下:

#!/usr/bin/stap

probe begin

probe syscall.open

probe timer.ms(4000) # after 4 seconds

probe end

使用#stap open.stp 開始執行。

這個指令碼會在系統中呼叫open時候,將呼叫者的執行名字和程序號給列印出來,只要有人呼叫open就會列印,無所遁形。systemtap提供了很多可以被printf函式呼叫的函式,除了execname(),pid()外,還有tid()等等。

常用的有:tid(),uid(),cpu(),gettimeofday_s(),ctime(),pp(),thread_indent(),

因為發行版本本身不包含debuginfo,所以在使用時候難免有些阻礙。

相比oprofile,systemtap適合做跟蹤,而oprofile適合做效能診斷。

官方原始碼:

《systemtap_begginers_guide.pdf》

官方例項:

systemtap概述及例項

systemtap對使用者級和核心級 提供了靜態和動態跟蹤的功能。systemtap採用其他的核心框架做源 靜態探針用tracepoints 動態探針用kprobes 使用者級別的探針用uprobes。這些源也為perf lttng所用。由於 systemtap 執行需要核心的除錯資訊支撐,預設發行...

演算法基礎例項概述及目錄

筆者開設本專題主要為了溫習一些常見演算法,主要受眾是一些考研的學生和工作演算法面試的程式設計師,希望本文章能對你有所幫助!將數字字串轉換成整數 求素數超長正整數加法 多項式相加 拓展字元 簡易計算器 計算e值 生成全排列數 漢諾塔 hanoi tower 遊戲 學生成績排序 從檔案中查詢包含給定字串...

Keepalived 概述及部署

keepalived 軟體起初是專為lvs 負載均衡軟體設計的,用來管理並監控lvs 集群系統中各個服務節點的狀態,後來又加入了可以實現高可用的vrrp 功能。因此,keepalived除了能夠管理lvs軟體外,還可以作為其他服務 例如 nginx haproxy mysql等 的高可用解決方案軟體...