GTF(General Trace Facility)是一款非常好的工具,能让你在大型机上的工作更轻松愉快。首先,GTF可以追踪和记录所有类型的系统事件,并提供详细的诊断数据,以便你查找那些很隐蔽的bug。当然,它的追踪结果报告也非常地让人头昏脑胀,很不容易找出用于调试程序的必要信息。不过,我们可以通过一个小小的REXX程序,再结合一个不是很传统的调试工具,就可以从大堆的GTF追踪数据中摘出简要的信息来。
利用GTF追踪SVC GTF还有一个非常有用的功能,就是获取SVC(supervisor call)指令。SVC指令是问题程序用于访问系统服务的指令。试想,假如我们系统的响应时间有些……
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属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就是件容易的事了。最终的电子数据表如下图所示:
通过自动筛选功能我们可以得到一个更简要结果。自动筛选功能选项在Excel“数据”选项卡的下拉菜单中可以找到。
在对表格进行筛选之后,我们可以选中PSW标签,然后查找出发出等待SVC的地址清单,如下图所示:
现在,相比前面的蛮干方法,我们得到了更为简要的五条PSW,而不是一条一条的去查找、对比。
分析GTF追踪数据的其它方法
当我想到调试时,我的脑海里是从来不会考虑到Excel的。然而,它的数据分析能力让它不失为一个分析GTF数据的好帮手。此外,我们也可以通过获取追踪时间或参数清单来对GTF的追踪结果进行分析。以上的原理对于其它形式GTF追踪结果也同样适用。