1. 程式人生 > >Shell應用(8):使用awk定位反彙編輸出

Shell應用(8):使用awk定位反彙編輸出

指令碼概述
   由於使用objdump反彙編linux核心的輸出太多(2.6.32-220.el6.x86_64統計結果為1457706行),而很多時候只是想檢視特定部分的機器碼與彙編指令,例如函式的入口、堆疊、呼叫了哪個函式等,為了高效和通用,因此編寫了一個簡單的awk指令碼,其命令列引數說明如下:
   ● SLINE表示匹配的起始行號(不小於1),SPAT表示匹配的起始行模式,這兩個只能有一個生效,當都有效時,以SLINE為準。
   ● NUM表示從起始行開始的連續輸出行數(不小於1,含起始行),EPAT表示匹配的結束行模式,這兩個只能有一個生效,當都有效時,以NUM為準。

指令碼實現
   檢查傳值

   由於向指令碼傳入的值在BEGIN塊內沒生效,在動作塊{}和END塊內有效,但若在{}內進行檢查則太低效,因為處理每條記錄都要判斷,所以為了避免在{}內進行多餘的判斷,就在BEGIN塊內解析命令列引數來間接獲得傳值,當傳值無效時,給出提示並退出。  1for(k=1;k<ARGC;++k){
 2        str=ARGV[k]
 3        if(1==match(str,"SLINE=")){
 4            SLINE = substr(str,7)
 5        }elseif(1==match(str,"SPAT=")){
 6            SPAT 
= substr(str,6)
 7        }elseif(1==match(str,"NUM=")){
 8            NUM = substr(str,5)
 9        }elseif(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
"16exit117  }
18
19if(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    exit122}
   結束處理
   當處理了NUM條記錄或匹配了結束行模式時,應退出動作塊{}。     1if(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            exit010
11    }else{
12        ++matched_nr
13        print $014        if(0!=match($0,EPAT))
15            exit016    }
17}
   完整指令碼下載:rangeshow

指令碼示例
   檢視linux核心第10000行開始的10條指令,如下圖
   
   
   檢視linux核心函式do_fork入口開始的10條指令,如下圖    
   

   檢視linux核心第10000行開始到callq的一段指令,如下圖
   

   檢視linux核心函式do_exit入口到呼叫profile_task_exit的一段指令,如下圖   
    posted on 2015-10-27 15:36 春秋十二月 閱讀(1087) 評論(1)  編輯 收藏 引用 所屬分類: System