如何利用GTF追踪结果调试大型机?

日期: 2010-03-15 作者:Robert Crawford翻译:涂凡才 来源:TechTarget中国 英文

GTF(General Trace Facility)是一款非常好的工具,能让你在大型机上的工作更轻松愉快。首先,GTF可以追踪和记录所有类型的系统事件,并提供详细的诊断数据,以便你查找那些很隐蔽的bug。当然,它的追踪结果报告也非常地让人头昏脑胀,很不容易找出用于调试程序的必要信息。不过,我们可以通过一个小小的REXX程序,再结合一个不是很传统的调试工具,就可以从大堆的GTF追踪数据中摘出简要的信息来。

  利用GTF追踪SVC   GTF还有一个非常有用的功能,就是获取SVC(supervisor call)指令。SVC指令是问题程序用于访问系统服务的指令。试想,假如我们系统的响应时间有些……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

GTF(General Trace Facility)是一款非常好的工具,能让你在大型机上的工作更轻松愉快。首先,GTF可以追踪和记录所有类型的系统事件,并提供详细的诊断数据,以便你查找那些很隐蔽的bug。当然,它的追踪结果报告也非常地让人头昏脑胀,很不容易找出用于调试程序的必要信息。不过,我们可以通过一个小小的REXX程序,再结合一个不是很传统的调试工具,就可以从大堆的GTF追踪数据中摘出简要的信息来。

  利用GTF追踪SVC

  GTF还有一个非常有用的功能,就是获取SVC(supervisor call)指令。SVC指令是问题程序用于访问系统服务的指令。试想,假如我们系统的响应时间有些问题,我们怀疑原因可能是某个应用在不断发出操作系统等待,而没有使用CICS应用程序接口(API)。利用GTF可以追踪这些SVC等待以及这些服务调用的指令地址。根据这些指令地址我们可以快速精准地找到发出非CICS等待的那个程序。

  如下是GTF的一些参数例子。值得注意的是,几年前GTF的参数是从控制台获得的。我们看下面的文本中,SVCP是为了告诉GTF在它后面的JOBNAMEP才是实际参数。因此,SVCP参数指向的是SVC项;SVC项会指定被追踪的SVC的数量。同样,JOBNAMEP指的是被追踪的JOBNAME。

  TRACE=SVCP,JOBNAMEP
  
  SVC=(1) JOBNAME=(CICSPROD),END

  GTF追踪的格式

  IBM的IPCS(Interactive Problem Control System)可以把GTF的追踪数据格式变得更规范些。下面粘贴的是截取的一部分例子,我们可以清晰看到很多有用信息。

  **** GTF TRACING ENVIRONMENT ****                                                            
       Release: SP7.0.9   FMID: HBB7740   System name: SYSP                                                  
       CPU Model: 2097  Version: 00  Serial no. 015EFF                                                       
                                                                                                           
  SVC..... 001  ASCB.... 00FC0880 CPU..... 0002     JOBNAME. CICSPROD OLD-PSW. 078D0001 95113178        
                TCB..... 00A98E00 MODN.... DFHKETCB R15... F918ABD8 R0... 00000001 R1... 1E19D328
                PLIST... 1E19D328                                                                       
            GMT-01/27/2010 18:27:46.321507  LOC-01/27/2010 12:27:46.321507                              
                                                                                                           
   SVC..... 001 ASCB.... 00FC0880 CPU..... 0001     JOBNAME. CICSPROD OLD-PSW. 078D0001 95112F3C        
                TCB..... 00AF8680 MODN.... DFHKETCB R15... BE06CECE R0... 00000001 R1... EA99C000
                PLIST... 15703128 000408B8 0022AB64 00054C8C 80054BE4                                   
            GMT-01/27/2010 18:27:46.321775  LOC-01/27/2010 12:27:46.321775                              

  这样,我们就得到了大量的诊断信息。但问题是我们还要区分由CICS系统代码发出的waits(等待)与应用程序发出的SVC。如果用比较蛮干的方法,可能就只有一条一条地阅读每一行追踪,并匹配PSW(Program Status Words)与CICS的负载模块。不过,这个方法可能要耗费不少时间。

  利用REXX和Excel浓缩GTF追踪数据

  幸好,利用一个小REXX程序就可以将GTF追踪结果转化为CSV文件(command separated value),然后导入到Excel。下面是一个REXX程序范本:

  /*  REXX  */         
  parse arg input                                                                
                                                                               
  "del 'user01.gtfsvc.csv'"                    /* Delete and reallocate output file  */
  "alloc fi(csvout) da('user01.gtfsvc.csv') unit(sysda) space(15 15)",
        "track new catalog lrecl(60) blksize(18000) recfm(f b) release"                                                                               
  csvout.1 = "SVC,Job Name,PSW,TCB"            /*  Write column headers  */
  "execio 1 diskw csvout (stem csvout."                                          
                                                                               
  "EXECIO 1 DISKR gtfin (stem gtfin."          /*  Top of input loop  */
  do while(rc = 0)                                                               
     if index(gtfin.1, 'SVC.....') > 0 then,   /*  Beginning of an entry */                                    
        do                                                                       
           firstWord = 2                                                         
           if word(gtfin.1, 1) = '1' then,     /*  Deal with page ejects */  
              do                                                                 
                 firstWord = 3                                                   
              end                                                                
           svc = word(gtfin.1, firstWord)      /*  Get SVC, job name and PSW  */
           jobname = word(gtfin.1, firstWord+6)                                  
           psw = word(gtfin.1, firstWord + 8) || ' ' || word(gtfin.1, firstWord+9)
           "EXECIO 1 DISKR gtfin (stem gtfin." /*  Get next line for TCB address  */                                   
           if word(gtfin.1, 1) = '1' then,     /*  Again with the page ejects?  */                                       
              do                                                                 
                 tcb = word(gtfin.1, 3)                                          
              end                                                                
           else,                                                                 
              do                                                                 
                 tcb = word(gtfin.1, 2)                                          
              end                                                                
           csvout.1 = svc || ',' || jobname || ',' || psw || ',' tcb             
           "execio 1 diskw csvout (stem csvout." /*  Build and write output  */
        end                                                                      
     "EXECIO 1 DISKR gtfin (stem gtfin."         /*  Get next line  */
  end                                                                            
                                                                               
  queue                                          /*  It's all over, go home  */
  address tso                                                                    
  "execio * diskr gtfin (finis)"                                                 
  "execio * diskW csvout (finis)"                                                
  "free fi(csvout)"      

  注:这段代码并不是通用的,有可能不适用你的GTF报告。

  这段代码中有个参数是DD语句的名字,指向一个包含GTF报告的数据集。本代码将把输出的CSV文件放到数据集userid.GTFSVC.CSV。输出的CSV文件包含四栏,分别是SVC number、job name、发出SVC的指令的PSW和威胁的TCB(任务控制块)。在CSV文件中,第一行是标题标签。

  然后,将CSV文件导入Excel就是件容易的事了。最终的电子数据表如下图所示:

如何利用GTF追踪结果调试大型机?

  通过自动筛选功能我们可以得到一个更简要结果。自动筛选功能选项在Excel“数据”选项卡的下拉菜单中可以找到。

  在对表格进行筛选之后,我们可以选中PSW标签,然后查找出发出等待SVC的地址清单,如下图所示:

如何利用GTF追踪结果调试大型机?
 
  

  现在,相比前面的蛮干方法,我们得到了更为简要的五条PSW,而不是一条一条的去查找、对比。

  分析GTF追踪数据的其它方法

  当我想到调试时,我的脑海里是从来不会考虑到Excel的。然而,它的数据分析能力让它不失为一个分析GTF数据的好帮手。此外,我们也可以通过获取追踪时间或参数清单来对GTF的追踪结果进行分析。以上的原理对于其它形式GTF追踪结果也同样适用。

作者

Robert Crawford
Robert Crawford

数据中心专家