1. 程式人生 > >使用systemtap除錯核心

使用systemtap除錯核心

SystemTap是半年之前接觸的東西了,今天突然又用到了點,怕再次忘記,就稍微找了點資料,再加上自己應用執行,就放在這裡了。主要是其指令碼的執行方式,包括指令碼中嵌入C時的編譯命令。

    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首先需要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的手冊。

下面是給的例子

每隔5秒統計系統呼叫 

#!/usr/bin/stap
global syscalls
function print_top() {
        cnt = 0
        //log (?.YSCALL\t\t\t\tCOUNT?.
        printf("%25s %10s\n","SYSCALL","COUNT")
        foreach (syscall in syscalls-) {
                //printf(?.-20s\t\t%5d\n?. name, syscalls[name])
                printf("%25s %10d\n",syscall,syscalls[syscall])
        if (cnt++ == 10)
                        break
        }
        printf("-------------------------------------\n")
        delete syscalls
}
probe syscall.* {
        syscalls[probefunc()]++
}
probe timer.ms(5000) {
        print_top()
}
探測點(probe):每個systemtap指令碼中至少需要定義一個探測點,也就是指定了在核心的什麼位置進行探測。探測點名
稱後面緊跟的一組大括號內定義了每次核心執行到該探測點時需要執行的操作,這些操作完成後再返回探測點,繼續下面的指令。這裡給出了systemtap目
前支援的所有探測點型別。
全域性變數(global):用來定義全域性變數。單個探測點函式體中使用的區域性變數不需要預先定義,但是如果一個變數需要在多個探測點函式體中使用,則需要定義為全域性變數。函式(function):用來定義探測點函式體中需要用到的函式。除了可以用指令碼語言定義函式以外,還可以用C語言來定義函式,只是這時函式名後面的大括號對需要換成%{ %}。

編譯命令為stap -v test.stp

執行結果為:

       這裡給出的是比較簡單的例子。利用SystemTap是可以跟蹤到核心函式的,比如open,write,read等函式,甚至可以跟蹤到vfs層的資料結構inode,dentry等,從而獲取inode,dentry中的資訊,對於核心除錯而言是很靈活很方便的。

       在SystemTap中還可以嵌入C語言的語句,但是編譯命令是:stap -gv test.stp

相關推薦

systemtap除錯核心

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

Linux系統中使用SystemTap除錯核心

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

使用systemtap除錯核心

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

使用systemtap除錯Linux核心

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

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

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

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

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

Xp+WinDBG+VMware除錯核心

轉:https://www.cnblogs.com/lzjsky/archive/2010/12/14/1905275.html 呵呵,搞點突兀的標題而已。其實說的還是如何使用WinDBG和VMware來搭建除錯核心的環境而已,這些網上已經有數不清的教程了,不過我喜歡自己親手寫一下。第一,把這個

使用gdb除錯核心錯誤資訊

配置gdb: Kernel hacking  --->     [*] Kernel debugging     [*] Compile the kernel with debug info 核心開發時有時候出現Oops,例如一個野指標會導致核心崩潰,

qemu + gdb 除錯核心

原文轉載自 https://blog.csdn.net/hoppboy/article/details/16886515 參考文章: http://blog.csdn.net/heli007/article/details/7187586  (比較推薦) http://

systemtap 除錯kernel2

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

使用Qemu+gdb來除錯核心

昨天聽別人講使用Qemu和gdb來實現原始碼級核心除錯,今天試了一下,果然非常方便,現簡單的記錄一下。 Qemu是一個開源的虛擬機器軟體,能夠提供全系統的模擬,可以執行在多個平臺上,並模擬多個別的平臺。Qemu虛擬機器是採用動態翻譯來實現CPU的模擬的,對硬體的依賴程度低,

Linux核心分析之三——使用gdb跟蹤除錯核心從start_kernel到init程序啟動

作者:姚開健 原創作品轉載請註明出處 《Linux核心分析》MOOC課程http://mooc.study.163.com/course/USTC-1000029000 Linux核心(本文以Linux-3.18.6為例)的啟動在原始碼init資料夾裡的main.c

搭建Windbg和Hyper-V第二代虛擬機器,雙機除錯核心環境

VMware太重了,4G記憶體筆記本跑起來好吃力,我的另外一臺E3+16G電腦,裝上VMware開機速度變得很慢,於是研究下,用windows原生的虛擬機器配合Windbg雙機除錯 系統最低win10,記得開啟bios上的虛擬化支援 第一步: 首先需要安裝Windbg執行環

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

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

Android核心開發 adb遠端除錯核心模組

PS:關於核心模組如何編寫編譯,有空再補上 1、連線遠端Android裝置 D:\test>adb.exe connect 192.168.1.3 * daemon not running. starting it now on port 5037 * * dae

使用Qemu除錯核心(host=aarch64)

1、編譯qemu-system-aarch64 隨後將該目錄新增到PATH變數並source ~/.bashrc 2、 下載並編譯核心 3、安裝gdb和gcc-c++ 4、除錯核心(本機,也可以通過網路) qemu-system-aarch

systemtap 除錯kernel1

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

QEMU+GDB除錯核心

    用GDB來除錯使用者態程式是一個方便快捷的定位問題的方法,極大的縮短了除錯程式和定位問題的時間。而對於核心或者驅動ko的除錯或者我們想了解核心執行的某些過程,我們也可以藉助於gdb工具。    GDB+QEMU的方式是一種比較常見的除錯核心和驅動的方法,這裡寫的是我在

Windbg除錯核心 操作手冊

前提:    符號已經下載好了 (不知道怎麼做的請度娘,關鍵字: Windbg 符號) 命令:   uf  地址         ------ 檢視指定地址處的程式碼 LKD命令:  .reload  過載符號 dt _eprocess 顯示Eprocess結構 dt

petalinux除錯核心

3.9 除錯核心 使用GDB在QEMU模擬的支援下除錯 1.啟動模擬核心 petalinux-boot –qemu –kernel 2.在QEMU啟動輸出的前幾行中,可以找到gdb 的 tcp埠號 -gdb tcp: 3.啟動linux另