Shell應用(8):使用awk定位反彙編輸出
阿新 • • 發佈:2018-12-22
指令碼概述
由於使用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
由於使用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
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
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