新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 使用 SystemTap 調試內核

        使用 SystemTap 調試內核

        作者: 時間:2016-09-12 來源:網絡 收藏

        是一種新穎的 Linux 內核診斷工具,提供了一種從運行中的 Linux 內核快速和安全地獲取信息的能力。 是內核開發人員和系統管理員的福音,因為這使得他們可以通過編寫或者重用簡單的腳本來收集內核的實時數據,而不需要再忍受修改源碼、編譯內核、重啟系統的漫長煎熬。本文介紹了 的安裝、使用和基本原理,并用一些有趣的例子揭示了 SystemTap 提供的強大能力。

        本文引用地址:http://www.104case.com/article/201609/304235.htm

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

        SystemTap 的目的就是要把人們從這種泥潭中解救出來。SystemTap 提供了一個簡單的命令行接口和強大的腳本語言,同時預定義了豐富的腳本庫。基于內核中的 kprobe,SystemTap允許你自由地從運行中的內核無害地收集調試信息和性能數據,來用于之后的分析和處理。你可以隨時開始或者停止這種收集過程,而無需漫長的修改代碼、編譯內核和重啟系統的悲慘循環。SystemTap 使得上面的問題變得簡單了,簡單得只需要一條命令就可以做到:

        stap -e 'probe syscall.read { printf(fd = %dn,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。如果沒有,也可以從如下的地址下載: http://download.fedora.redhat.com/pub/fedora/linux/

        core/updates/testing/6/i386/SystemTap-0.5.10-1.fc6.i386.rpm

        2.通過源碼安裝:

        從SystemTap的FTP站點下載最新的源碼

        ftp://sources.redhat.com/pub/SystemTap/snapshots/SystemTap-20061104.tar.bz2

        然后安裝如下:

        /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/stapglobal countfunction report(stat) {printf(stat=%dn, stat)}probe kernel.function(sys_read) {++count}probe end {report()}

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

        全局變量(global):用來定義全局變量。單個探測點函數體中使用的局部變量不需要預先定義,但是如果一個變量需要在多個探測點函數體中使用,則需要定義為全局變量。

        函數(function):用來定義探測點函數體中需要用到的函數。除了可以用腳本語言定義函數以外,還可以用C語言來定義函數,只是這時函數名后面的大括號對需要換成%{ %}。例如,前面的report()函數可以寫成:function report(stat) %{_stp_printf(stat=%dn, THIS->stat);%}

        SystemTap的例子

        了解了SystemTap的基本用法,下面讓我們來看幾個有趣的例子。

        統計當前系統中調用最多的前10個系統調用

        在進行性能分析的時候,我們常常需要知道那些函數調用次數最多,才能有的放矢地展開分析。下面這個簡單的例子可以打印出在過去的5秒鐘里調用次數最多的那些系統調用。


        上一頁 1 2 下一頁

        關鍵詞: SystemTap 調試內核

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 霍城县| 兴海县| 桃源县| 张家口市| 邢台市| 长乐市| 改则县| 淮南市| 锦州市| 灯塔市| 巴彦县| 广宁县| 凤冈县| 宜章县| 漯河市| 思茅市| 宝山区| 师宗县| 济南市| 咸阳市| 博爱县| 许昌县| 海阳市| 乡城县| 江陵县| 察哈| 和政县| 鄂托克旗| 阜新市| 乐业县| 乡宁县| 新和县| 化州市| 和平区| 龙州县| 林芝县| 潼关县| 嘉义县| 南皮县| 邹平县| 乃东县|