随笔-156  评论-223  文章-30  trackbacks-0
脚本概述
   由于使用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        }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}

   结束处理
   当处理了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            exit 0
10
11    }else{
12        ++matched_nr
13        print $0        
14        if(0!=match($0,EPAT))
15            exit 0
16    }
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 春秋十二月 阅读(1735) 评论(1)  编辑 收藏 引用 所属分类: System

评论:
# re: Shell应用(8):使用awk定位反汇编输出[未登录] 2015-10-28 12:05 | Chipset
厉害  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理