腳本概述 由于使用objdump反匯編linux內(nèi)核的輸出太多(2.6.32-220.el6.x86_64統(tǒng)計(jì)結(jié)果為1457706行),而很多時(shí)候只是想查看特定部分的機(jī)器碼與匯編指令,例如函數(shù)的入口、堆棧、調(diào)用了哪個(gè)函數(shù)等,為了高效和通用,因此編寫了一個(gè)簡單的awk腳本,其命令行參數(shù)說明如下:
● SLINE表示匹配的起始行號(不小于1),SPAT表示匹配的起始行模式,這兩個(gè)只能有一個(gè)生效,當(dāng)都有效時(shí),以SLINE為準(zhǔn)。
● NUM表示從起始行開始的連續(xù)輸出行數(shù)(不小于1,含起始行),EPAT表示匹配的結(jié)束行模式,這兩個(gè)只能有一個(gè)生效,當(dāng)都有效時(shí),以NUM為準(zhǔn)。
腳本實(shí)現(xiàn) 檢查傳值 由于向腳本傳入的值在BEGIN塊內(nèi)沒生效,在動作塊{}和END塊內(nèi)有效,但若在{}內(nèi)進(jìn)行檢查則太低效,因?yàn)樘幚砻織l記錄都要判斷,所以為了避免在{}內(nèi)進(jìn)行多余的判斷,就在BEGIN塊內(nèi)解析命令行參數(shù)來間接獲得傳值,當(dāng)傳值無效時(shí),給出提示并退出。
1
for(k=1;k<ARGC;++k){
2
str=ARGV[k]
3
if(1==match(str,"SLINE=")){
4
SLINE = substr(str,7)
5
}else if(1==match(str,"SPAT=")){
6
SPAT = substr(str,6)
7
}else if(1==match(str,"NUM=")){
8
NUM = substr(str,5)
9
}else if(1==match(str,"EPAT=")){
10
EPAT = substr(str,6)
11
}
12
}
13
14 if(SLINE<=0 && SPAT==""){
15 print "Usage: rangeshow must specifies valid SLINE which must be greater than 0, or SPAT which can't be empty"
16 exit 1
17 }
18
19 if(NUM<=0 && EPAT==""){
20 print "Usage: rangeshow must specifies valid NUM which must be greater than 0, or EPAT which can't be empty"
21
exit 1
22
} 結(jié)束處理 當(dāng)處理了NUM條記錄或匹配了結(jié)束行模式時(shí),應(yīng)退出動作塊{}。
1
if(0==start_nr){
2
3
}else{
4
if(NUM>0) {
5
if(NR<start_nr+NUM) {
6
++matched_nr
7
print $0
8
}else
9
exit 0
10
11
}else{
12
++matched_nr
13
print $0
14
if(0!=match($0,EPAT))
15
exit 0
16
}
17
} 完整腳本下載:
rangeshow。
腳本示例
查看linux內(nèi)核第10000行開始的10條指令,如下圖
查看linux內(nèi)核函數(shù)do_fork入口開始的10條指令,如下圖

查看linux內(nèi)核第10000行開始到callq的一段指令,如下圖

查看linux內(nèi)核函數(shù)do_exit入口到調(diào)用profile_task_exit的一段指令,如下圖
posted on 2015-10-27 15:36
春秋十二月 閱讀(1784)
評論(1) 編輯 收藏 引用 所屬分類:
System