
怎樣自己建設網(wǎng)站:調(diào)試內(nèi)核態(tài)的信息,就需要在安裝SystemaTap包
但是如果需要調(diào)試內(nèi)核態(tài)的信息,就需要在安裝SystemaTap包的同時安裝和內(nèi)核相
匹配版本的-devel、-debuginfo以及-debuginfo-common。
注意,包的名稱必須完全匹配才行。比如服務器的內(nèi)核是kernel-2.6.32.279.22.l.r16.
x86_64.rpm,那么對應安裝的debuginfo包就必須是kernel-debugin fo-2.6.3 2.279.22.l.r16.
x86_64.rpm。
通過uname.r命令可以查看當前內(nèi)核的全名,如下。
debuginf的包,通常在http://debuginfo.centos.org/上可以下載。如果這里沒有,比如
你的kernel.rpm本來就是自己編譯出來的,那么就只能自己再對應編譯kernel-debuginfo.
rpm了。
安裝完成之后可以測試內(nèi)核是否已經(jīng)成功支持SystemTap,如下。
一 一
, 如果該腳本能夠正常運行,在終端上將看到各種調(diào)試輸出,以及最終結果“hello world”
字符串,整個輸出是類似下面這樣的。
Pass l: parsed user script and 72 library script (s) usinS 87132virt/21460res/
2600shr kb, in 180usr/10sys/189real ms.:l ;
Pass 2: analyzed script: 1 probe (s), 2 function (s), 0 embed(s) , 0 global (s)
●25●
網(wǎng)站運維技術與實踐
using 87528virt/22152res/2816shr kb, in 10usr/Osys/6real ms.
Pass 3: using cached /root/.systemtap/cache/f5/stap_f59e55597ca61773644-
fc7321e27693f_790.c
Pass 4: using cached /root/.systemtap/cache/f5/stap_f59e55597ca61773644-
fc7321e27693f 790.ko
Pass 5: starting run,
. hello world : ; . : '
Pass 5: run completed in Ousr/10sys/283real mS-i .
從調(diào)試信息中,也可以確認之前提到的
stap_f59e55597ca61773644fc7321e27693f_790.ko
一點,即stap確實是編譯出來了一個
內(nèi)核模塊并加載的。
1.3.8.2基礎語法
首先介紹stap腳本的基礎語法,即常用函數(shù),控制結構和運行參數(shù)。
1.常用函數(shù)
stap腳本中每個完整的結構都是由probe組成的,表明語句像探針一樣插入某個位置
等待觸發(fā)事件。事件分為同步事件和異步事件。
芎用的同步事件類型如表1.3所示。
表1-3 | |
事件類型 | 探針觸發(fā)時刻 |
kemel.function(" sys_sync").call | 調(diào)用sys_sync時 |
kemel.function(" sys_syne ").retum | 返回sys_sync時 |
syscall.read | 系統(tǒng)調(diào)用read()時 |
kemel.function("*@kerne Vfork.c").return | 從fork.c中任一函數(shù)返回時 |
kemel.statement("*@kernel/sched.c:29 1 7 ") | 運行到文件kemel/sched.c第2917行 |
process("/lib/libs.so.6 ").function(" *malloc*') | 進入名字包含“malloc”的glibe函數(shù) |
module(" ext3 ").function(" ext3~file_write") | 調(diào)用ext3模塊的write函數(shù)時 |
異步事件則如表1-4所示。
表1-4 | |
事件類型 | 探針觸發(fā)時刻 a |
begin | stap腳本開始運行時 《 |
End
timer.jiffies(1000)
timer.ms(200).randomize(50)