日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

内核探测工具systemtap简介

發(fā)布時間:2024/1/23 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 内核探测工具systemtap简介 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

systemtap是內(nèi)核開發(fā)者必須要掌握的一個工具,本文我將簡單介紹一下此工具,后續(xù)將會有系列文章介紹systemtap的用法。

什么是systemtap


假如現(xiàn)在有這么一個需求:需要獲取正在運行的Linux系統(tǒng)的信息,如我想知道系統(tǒng)什么時候發(fā)生系統(tǒng)調(diào)用,發(fā)生的是什么系統(tǒng)調(diào)用等這些信息,有什么解決方案呢?

  • 最原始的方法是,找到內(nèi)核系統(tǒng)調(diào)用的代碼,加上我們需要獲得信息的代碼、重新編譯內(nèi)核、安裝、選擇我們新編譯的內(nèi)核重啟。這種做法對于內(nèi)核開發(fā)人員簡直是夢魘,因為一遍做下來至少得需要1個多小時,不僅破壞了原有內(nèi)核代碼,而且如果換了一個需求又得重新做一遍上面的工作。所以,這種調(diào)試內(nèi)核的方法效率是極其低下的。
  • 之后內(nèi)核引入了一種Kprobe機制,可以用來動態(tài)地收集調(diào)試和性能信息的工具,是一種非破壞性的工具,用戶可以用它跟蹤運行中內(nèi)核任何函數(shù)或執(zhí)行的指令等。相比之前的做法已經(jīng)有了質(zhì)的提高了,但Kprobe并沒有提供一種易用的框架,用戶需要自己去寫模塊,然后安裝,對用戶的要求還是蠻高的。
  • systemtap是利用Kprobe提供的API來實現(xiàn)動態(tài)監(jiān)控和跟蹤運行中的Linux內(nèi)核的工具,相比Kprobe,systemtap更加簡單,提供給用戶簡單的命令行接口,以及編寫內(nèi)核指令的腳本語言。對于開發(fā)人員,systemtap是一款難得的工具。

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

systemtap的安裝


我的主機 Linux 發(fā)行版是32位 Ubuntu13.04,內(nèi)核版本 3.8.0-30。由于 systemtap 運行需要內(nèi)核的調(diào)試信息支撐,默認(rèn)發(fā)行版的內(nèi)核在配置時這些調(diào)試開關(guān)沒有打開,所以安裝完systemtap也是無法去探測內(nèi)核信息的。 下面我以兩種方式安裝并運行 systemtap:

方法一

  • 編譯內(nèi)核以支持systemtap?
    我們重新編譯內(nèi)核讓其支持systemtap,首先你想讓內(nèi)核中有調(diào)試信息,編譯內(nèi)核時需要加上 -g 標(biāo)志;其次,你還需要在配置內(nèi)核時將 Kprobe 和 debugfs 開關(guān)打開。最終效果是,你能在內(nèi)核 .config 文件中看到下面四個選項是設(shè)置的:

    CONFIG_DEBUG_INFOCONFIG_KPROBESCONFIG_DEBUG_FSCONFIG_RELAY

    配置完之后,按照之前你編譯內(nèi)核的步驟編譯即可。

  • 獲取systemtap源碼?
    從此地址?https://sourceware.org/systemtap/ftp/releases下載已經(jīng)發(fā)布的systemtap的源代碼,截至目前(2013.9.17)最新版本為systemtap-2.3。下載完之后解壓。 當(dāng)然你還可以使用 git 去克隆最新的版本(2.4),命令如下:

    git clone git://sources.redhat.com/git/systemtap.git
  • 編譯安裝systemtap?
    如果你下載的是最新版本的systemtap,那么你需要新版的 elfutils,可以從https://fedorahosted.org/releases/e/l/elfutils/?下載elfutils-0.156 版本。下載之后解壓縮到適合的目錄(我放在~/Document/ 下),不需要安裝,只要配置systemtap時指定其位置即可。 進入之前解壓systemtap的目錄,使用下面命令進行配置:

    ./configure --with-elfutils=~/Document/elfutils-0.156

    以這里方法配置之后,你只需要再運行?make install?即完成systemtap的編譯安裝。如果需要卸載的話,運行?make uninstall

  • 方法二

    由于發(fā)行版的內(nèi)核默認(rèn)無內(nèi)核調(diào)試信息,所以我們還需要一個調(diào)試內(nèi)核鏡像,在http://ddebs.ubuntu.com/pool/main/l/linux/?找到你的內(nèi)核版本相對應(yīng)的內(nèi)核調(diào)試鏡像(版本號包括后面的發(fā)布次數(shù)、硬件體系等都必須一致),如針對我上面的內(nèi)核版本,就可以用如下命令下載安裝內(nèi)核調(diào)試鏡像:

    $ wget http://ddebs.ubuntu.com/pool/main/l/linux/linux-image-debug-3.8.0-30-generic_dbgsym_3.8.0-30.43_i386.ddeb $ sudo dpkg -i linux-image-debug-3.8.0-30-generic_dbgsym_3.8.0-30.43_i386.ddeb

    一般這種方法下,你只需要使用apt在線安裝systemtap即可:

    $sudo apt-get install systemtap

    當(dāng)然方法二僅限于Ubuntu發(fā)行版,至于其他的發(fā)行版并不能照搬,網(wǎng)上也有很多相關(guān)的資料。

    systemtap 測試示例

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

    示例一:打印hello systemtap

    以root用戶或者具有sudo權(quán)限的用戶運行以下命令:

    $stap -ve 'probe begin { log("hello systemtap!") exit() }'

    如果安裝正確,會得到如下類似的輸出結(jié)果:

    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.

    示例二:打印4s內(nèi)所有open系統(tǒng)調(diào)用的信息

    創(chuàng)建systemtap腳本文件test2.stp:

    #!/usr/bin/stapprobe begin {log("begin to probe") }probe syscall.open {printf("%s(%d) open(%s)\n", execname(), pid(), argstr) }probe timer.ms(4000) # after 4 seconds {exit() }probe end {log("end to probe") }

    將該腳本添加可執(zhí)行的權(quán)限chmod +x test2.stp,使用./test2.stp運行該腳本,即可打印4s內(nèi)所有open系統(tǒng)調(diào)用的信息,打印格式為:進程名(進程號)打開什么文件。大家可以自行去測試,如果兩個示例都能正確運行,基本上算是安裝成功了!

    systemtap 工作原理

    systemtap 的核心思想是定義一個事件(event),以及給出處理該事件的句柄(Handler)。當(dāng)一個特定的事件發(fā)生時,內(nèi)核運行該處理句柄,就像快速調(diào)用一個子函數(shù)一樣,處理完之后恢復(fù)到內(nèi)核原始狀態(tài)。這里有兩個概念:

    • 事件(Event): systemtap定義了很多種事件,例如進入或退出某個內(nèi)核函數(shù)、定時器時間到、整個systemtap會話啟動或退出等等。
    • 句柄(Handler):就是一些腳本語句,描述了當(dāng)事件發(fā)生時要完成的工作,通常是從事件的上下文提取數(shù)據(jù),將它們存入內(nèi)部變量中,或者打印出來。

    Systemtap工作原理是通過將腳本語句翻譯成C語句,編譯成內(nèi)核模塊。模塊加載之后,將所有探測的事件以鉤子的方式掛到內(nèi)核上,當(dāng)任何處理器上的某個事件發(fā)生時,相應(yīng)鉤子上句柄就會被執(zhí)行。最后,當(dāng)systemtap會話結(jié)束之后,鉤子從內(nèi)核上取下,移除模塊。整個過程用一個命令stap就可以完成。上面只是簡單的原理,更多背后的機理參考網(wǎng)上資料和相應(yīng)的論文。

    更多參考

    • systemtap 官網(wǎng)給出了自學(xué)教程及相關(guān)論文,選擇看這個已經(jīng)足夠了:https://sourceware.org/systemtap/documentation.html
    • IBM 編寫的systemtap 指南也是很不錯的:?http://www.redbooks.ibm.com/abstracts/redp4469.html

    ?

    創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

    總結(jié)

    以上是生活随笔為你收集整理的内核探测工具systemtap简介的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。