1. 程式人生 > >systemtap 除錯kernel1

systemtap 除錯kernel1

SystemTap 是一種新穎的 Linux 核心診斷工具,提供了一種從執行中的 Linux 核心快速和安全地獲取資訊的能力。SystemTap 是核心研發人員和系統管理員的福音,因為這使得他們能通過編寫或重用簡單的指令碼來收集核心的實時資料,而不必再忍受修改原始碼、編譯核心、重啟系統的漫長煎 熬。本文介紹了 SystemTap 的安裝、使用和基本原理,並用一些有趣的例子揭示了 SystemTap 提供的強大能力。

在 SystemTap 出現之前,對於 Linux 程式員或系統管理員而言,除錯核心往往是一場噩夢。例如,你懷疑傳遞給系統呼叫 read 的引數 fd 出了問題,想把他打印出來,你需要做的是:首先得到一份核心原始碼,找到 sys_read() 的函式體中插入 printk() 語句,接下來重新編譯核心,然後用新的核心重新啟動系統。謝天謝地,你總算看到了你想要看到的東西,不過你馬上會發現遇見了一個新的麻煩:除非重新啟動系 統到原來的核心,printk() 會無休止地列印下去。

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

stap -e ’probe syscall.read { printf("fd = %d\n",fd) }

SystemTap的功能和Sun的DTrace和IBM的dprobe工具相似。不過和他 們不同的是, SystemTap是遵循GPL的開源軟體專案。他的出現使得Linux社群也擁有了功能強大而且易於使用的動態核心除錯工具。目前,SystemTap 的主要研發成員來自於RedHat、IBM、Intel和Hitachi,其中還包括來自IBM中國研發中心的工程師。

安裝SystemTap

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

kernel-debuginfo RPM:SystemTap需要通過核心除錯資訊來定位核心函式和變數的位置。對於通常的發行版,並沒有安裝kernel-debuginfo RPM,我們能到發行版的下載站點下載。對於我的ThinkPad上的Fedora Core 6,這個地址是: http://download.fedora.redhat.com/pub/fedora/linux/core/6/i386/debug/

elfutils RPM:SystemTap需要elfutils軟體包提供的庫函式來分析除錯資訊。目前的SystemTap需求安裝elfutils-0.123以上 版本。目前最新的版本是0.124-0.1。如果需要,我們能從SystemTap的站點下載RPM或原始碼來升級。下載地址是: ftp://sources.redhat.com/pub/SystemTap/elfutils/i386/

接下來就能安裝SystemTap了,這有通過RPM或原始碼安裝兩種方式:

1. 通過RPM安裝Fedora Core 6預設情況下已安裝了systemtap。

2.通過原始碼安裝,從SystemTap的FTP站點下載最新的原始碼。

然後安裝如下:

/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) {
printf("stat=%d\n", stat)
}
probe kernel.function("sys_read") {
++count
}
probe end {
report()
}

探測點(probe):每個systemtap指令碼中至少需要定義一個探測點,也就是指定了 在核心的什麼位置進行探測。探測點名稱後面緊跟的一組大括號內定義了每次核心執行到該探測點時需要執行的操作,這些操作完成後再返回探測點,繼續下面的指 令。這裡給出了systemtap目前支援的所有探測點型別。

全域性變數(global):用來定義全域性變數。單個探測點函式體中使用的區域性變數不必預先定義,不過如果一個變數需要在多個探測點函式體中使用,則需要定義為全域性變數。

函式(function):用來定義探測點函式體中需要用到的函式。除了能用指令碼語言定義函式以外,還能用C語言來定義函式,只是這時函式名後面的大括號對需要換成%{ %}。例如,前面的report()函式能寫成:

function report(stat) %{
_stp_printf("stat=%d\n", THIS->stat);
%}

SystemTap的例子

瞭解了SystemTap的基本用法,下面讓我們來看幾個有趣的例子。統計當前系統中呼叫最 多的前10個系統呼叫,在進行效能分析的時候,我們常常需要知道那些函式呼叫次數最多,才能有的放矢地展開分析。下面這個簡單的例子能打印出在過去的5秒 鍾裡呼叫次數最多的那些系統呼叫。

#!/usr/bin/env stap
#
# display the top 10 syscalls called in last 5 seconds
#
global syscalls
function print_top () {
cnt=0
log ("SYSCALL\t\t\t\tCOUNT")
foreach ([name] in syscalls-) {
printf("%-20s\t\t%5d\n",name, syscalls[name])
if (cnt++ == 10)
break
}
printf("--------------------------------------\n")
delete syscalls
}
probe syscall.* {
syscalls[probefunc()]++
}
probe timer.ms(5000) {
print_top ()
}

他的輸出結果一目瞭然:


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

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

#!/usr/bin/env stap
#
# monitor who is messing my file of secrets
#
probe generic.fop.open {
if(filename == "secrets")
printf("%s is opening my file: %s\n", execname(), filename)
}

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



列印ANSI字串

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

#!/usr/bin/env stap
#
# print colorful ANSI strings
#
probe begin {
printf("a \\ b |");
for (c = 40; c < 48; c++)
printf(" %d ", c);
printf("\12");
for (l = 0; l < 71; l++)
printf("-");
printf("\12");
for (r = 30; r < 38; r++)
for (t = 0; t < 2; t++) {
printf("%d |", r);
for (c = 40; c < 48; c++)
printf("\033[%d;%d%s %s \033[0;0m",
r, c, !t ? "m" : ";1m", !t ? "Normal" : "Bold ");
printf("\12");
}
exit();
}

來看看他的輸出:


SystemTap的基本原理


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

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

下面來介紹每一個階段的主要功能:

Pass 1 - parse:這個階段主要是檢查輸入指令碼是否存在語法錯誤,例如大括號是否匹配,變數定義是否規範等。

Pass 2 - elaborate:這個階段主要是對輸入指令碼中定義的探測點或用到的函式展開,不僅需要綜合SystemTap的預定義指令碼庫,還需要分析核心或核心模組的除錯資訊。

Pass 3 - translate: 在這個階段,將展開後的指令碼轉換成C檔案。前三個階段的功能類似於編譯器,將.stp檔案編譯成為完整的.c檔案,因此又被合起來稱為轉換器(translator)。

Pass 4 - build:在這個階段,將C原始檔編譯成核心模組,在這過程中還會用到SystemTap的執行時庫函式。

Pass 5 - run:這個階段,將編譯好的核心模組插入核心,開始進行資料收集和傳輸。

小結

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

相關推薦

systemtap 除錯kernel1

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

使用systemtap除錯Linux核心

最近在公司看Linux核心的nmi死鎖檢測功能的實現機制,當然,是因為它變了,所以我才看的,簡單來說就是在紅帽的某牛提交了一個核心patch:new nmi_watchdog using perf events,這個patch已經被合入到核心主線2.6.38版本,所以使用自該版本開始後核心的

使用systemtap除錯工具分析MySQL的效能

【工具】 SystemTap是Linux下的動態跟蹤工具,可以方便的監控、跟蹤執行中的程式或Linux核心操作,我們通過寫SystemTap指令碼(與C語言類似),編譯為核心模組,然後載入到核心中執行,它帶來的效能損耗比較小。 【兩個應用舉例】 一、     分析

systemtap除錯核心

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

systemtap 除錯kernel2

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

春哥的nginx systemtap除錯指令碼簡單介紹

     因為一直在ubuntu上使用,所以安裝很簡單 sudo apt-get installsystemtap,原始碼安裝的話請參考這篇文章:http://www.cnblogs.com/hazir/p/systemtap_introduction.html中的方法一。 二、核心除錯資訊      不用跟

Linux系統中使用SystemTap除錯核心

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

使用systemtap除錯核心

SystemTap是半年之前接觸的東西了,今天突然又用到了點,怕再次忘記,就稍微找了點資料,再加上自己應用執行,就放在這裡了。主要是其指令碼的執行方式,包括指令碼中嵌入C時的編譯命令。     SystemTap是一種新穎的 Linux 核心診斷工具,提供了一種從執行中的 Linux 核心快速和安全地獲取資

linux核心:systemtap核心除錯 例子

¶ virtualization/kvm_service_time.stp - Time Statistics on KVM Exit Reasons keywords: VIRTUALIZATION KVM  The kvm_service_time.stp script tracks the st

核心除錯神器SystemTap — 更多功能與原理(三)

a linux trace/probe tool. 使用者空間 SystemTap探測使用者空間程式需要utrace的支援,3.5以上的核心版本預設支援。 對於3.5以下的核心版本,需要自己打相關補丁。 需要: debugging information for t

核心除錯神器SystemTap — 簡介與使用(一)

a linux trace/probe tool. 簡介 SystemTap是我目前所知的最強大的核心除錯工具,有些傢伙甚至說它無所不能:) (1) 發展歷程 Debuted in 2005 in Red Hat Enterprise Linux 4 Update

核心除錯神器SystemTap

a linux trace/probe tool. 簡介 SystemTap是我目前所知的最強大的核心除錯工具,有些傢伙甚至說它無所不能:) (1) 發展歷程 Debuted in 2005 in Red Hat Enterprise Linux 4 Update 2 as a technology

核心除錯神器SystemTap — 探測點與語法(二)

a linux trace/probe tool. 探測點 SystemTap指令碼主要是由探測點和探測點處理函式組成的,來看下都有哪些探測點可用。 The essential idea behind a systemtap script is to name eve

systemtap安裝&核心除錯環境配置

我是在ubuntu下安裝的,所以轉至這個網頁: 1.systemtap的安裝 systemtap的安裝是很簡單的,一條命令足以: $sudo apt-get install systemtap 此時,你執行如下測試命令: $sudo stap -ve 'probe

內核調試神器SystemTap — 簡單介紹與使用(一)

kprobe utils its preview response art sym about output a linux trace/probe tool. 官網:https://sourceware.org/systemtap/ 簡單介紹 S

SystemTap

tar.gz 2.0 -- ask .tar.gz mta track nor fig 安裝 sudo apt-get install build-essential sudo apt-get install elfutils sudo apt-get ins

systemtap安裝

img jin 調用 linux 正常 內核 file ios 版本 一、systemtap介紹   SystemTap是一個強大的調試工具,是監控和跟蹤運行中的Linux 內核的操作的動態方法,確切的說應該是一門調試語言,因為它有自己的語法,也有解析、編譯、運行等過程(準

systemtap如何寫C函數 捎帶著看看ret kprobe怎麽用

tasks blank valid clas ktr pri may sin hat 在systemstap中自定義函數 Embedded C can be the body of a script function. Instead enclosing the funct

SystemTap Beginners Guide

I/O multi https require ber most nta RM cal SystemTap 3.0 SystemTap Beginners Guide Introduction to SystemTap Edition 3.0 Red

selenium除錯

serve throw 問題 log CA src AR 出現 nbsp 1.使用命令行啟動selenium   下載selenium jar包  http://selenium-release.storage.googleapis.com/index.html   此處下