GTFトレースの採取とフォーマット
MVSにはGTFと呼ばれる汎用トレース機能があります。MVS自身の動作やアプリケーション・プログラムなどの動きをシステムのレベルでトレースする機能です。一般のプログラムのデバッグには向きませんが、アセンブラー言語で作成されたシステム系プログラムなどの動きを追跡したりする目的で利用することもできます。GTFではトレースする項目をイベントと呼び、以下のようなものがあります。
- SVC命令の発行
- デバイスI/O動作
- プログラム割込みの発生
- VTAMネットワークI/O動作 など
その他ユーザープログラムでデータを書き込むこともできます。
余程のことがない限り一般のユーザーが自ら使うことはありませんが、基盤系ソフトやISV製品などに問題が考えられる時、メーカーやベンダーの依頼でトレースを採ることがありますので、使い方は知っておいた方がいいでしょう。トレースの採取やフォーマットのパラメーターについては依頼する人が必要なものを提示しますから、ユーティリティ名や基本のJCLコーディングなどがわかれば十分です。
GTF起動プロシージャ・サンプル
-
MVS用
//GTF PROC //IEFPROC EXEC PGM=AHLGTF,REGION=2880K,TIME=1440, // PARM='MODE=EXT,TIME=YES,DEBUG=NO' //IEFRDER DD DISP=SHR,DSN=SYS1.TRACE //GTF PROC //IEFPROC EXEC PGM=AHLGTF,REGION=2880K,TIME=1440, // PARM='MODE=EXT,TIME=YES,DEBUG=NO' //GTFOUT01 DD DISP=SHR,DSN=USR1.GTFDATA1 //GTFOUT02 DD DISP=SHR,DSN=USR1.GTFDATA2 //GTFOUT03 DD DISP=SHR,DSN=USR1.GTFDATA3MSP用
//GTF PROC //KDJPROC EXEC PGM=JQMGTF,REGION=2880K,TIME=1440, // PARM='MODE=EXT,TIME=YES,DEBUG=NO' //KDJRDER DD DISP=SHR,DSN=SYS1.TRACE //GTF PROC //KDJPROC EXEC PGM=JQMGTF,REGION=2880K,TIME=1440, // PARM='MODE=EXT,TIME=YES,DEBUG=NO' //GTFTRC01 DD DISP=SHR,DSN=USR1.GTFDATA1 //GTFTRC02 DD DISP=SHR,DSN=USR1.GTFDATA2 //GTFTRC03 DD DISP=SHR,DSN=USR1.GTFDATA3VOS3用
//GTF PROC //JDJPROC EXEC PGM=JSMEVTR,REGION=(512K,17M),TIME=1440, // PARM='MODE=EXT,TIME=YES,DEBUG=NO' //JDJRDER DD DISP=SHR,DSN=SYS1.TRACE
-
トレースデータセットの作成
//TRACE1 DD DISP=(,CATLG),DSN=USR1.GTFDATA1, // UNIT=SYSDA,VOL=SER=WRKVOL, // SPACE=(CYL,50),DCB=DSORG=PS
トレースデータを格納するデータセットはIEFRDERまたはGTFOUTnn DD文で定義します(OSにより異なるのでサンプルを参照)。長時間トレースを採取する場合、1つのデータセットでは足りなくなることがあります。そのような場合は複数のトレースデータセットを定義して利用できます(VOS3を除く)。1つであっても複数であっても利用可能なデータセットが一杯になると先頭のデータセットから循環使用されます。
新規にトレースデータセットを作成する場合は、PSデータセットとして容量のみを指定します。RECFM、ブロック長、レコード長はGTFが起動時に設定し直します。ただしDCBにDSORG=PSを指定しないとGTFの起動は失敗します。
GTFの起動操作
S GTF起動プロシージャ名.GTF (トレースオプションの入力を促すMSGが出る) nn,トレースオプション (MSGに従って追加のトレースオプションを入力する) [nn,追加のトレースオプション] (すべてのトレースオプションを入力したら) nn,U
※GTFは同時に複数起動することはできません。プロシージャ名を変えてもだめです。
GTFトレースオプションの例
SVCトレースを採る
nn,TRACE=SVCP,JOBNAMEP nn,SVC=(48,56),JOBNAME=xxxxxxxx,END nn,U
特定のジョブに関してのみトレースする場合は、JOBNAMEP(MSPはSPACEP)オプションが利用できます。
I/Oトレースを採る
アドレス205のデバイスのI/O動作をトレースする例。
MVSnn,TRACE=IOP,SSCHP,CCWP nn,IO=SSCH=205 nn,CCW=(SI,DATA=1024) nn,END nn,UMSP
nn,TRACE=IOP,SIOP,CCWP nn,IO=SIO=205 nn,CCW=(EVENT=(IO,START,PCI),CMD=LAST,DATA=1024) nn,END nn,UVOS3
nn,TRACE=IOP,SIOP,CCWP nn,IO=SIO=205 nn,CCW=(,1024) nn,END nn,U
VTAM送受信データのトレースを採る
LU名で指定された端末とホスト間のVTAM送受信データをトレースする例。
MVSnn,TRACE=USRP nn,USR=FEF nn,END nn,U F NET,TRACE,TYPE=BUF,ID=LU名,AMOUNT=FULL 端末を使ってトレースしたい処理を行う F NET,NOTRACE,TYPE=BUF,ID=LU名MSP
nn,TRACE=USR nn,U F NET,TRACE,TYPE=SESS,ID=LU名,TDATA=ALL 端末を使ってトレースしたい処理を行う F NET,NOTRACE,TYPE=SESS,ID=LU名
MVSではIBM製品(TSOなど)に関してはセキュリティー上の理由で送受信データに関してはトレースされない場合があります。
トレースデータのフォーマットJCLサンプル(MVS)
// JOB Statement //IPCS EXEC PGM=IKJEFT01 //SYSPROC DD DISP=SHR,DSN=SYS1.SBLSCLI0 //SYSUT1 DD DISP=SHR,DSN=トレースデータセット名 //SYSTSPRT DD SYSOUT=* //IPCSPRNT DD SYSOUT=* //SYSTSIN DD * DEFINE CLUSTER(NAME('TMP1.IPCS.DIRECTRY') VOL(WRKVOL)) - INDEX(NAME('TMP1.IPCS.DIRINDEX') CYLINDERS(1 1)) - DATA(NAME('TMP1.IPCS.DIRDATA') CYLINDERS(4 1) - KEYS(128 0) CONTROLINTERVALSIZE(4096)) ALLOC F(IPCSDDIR) DA('TMP1.IPCS.DIRECTRY') IPCSDDIR 'TMP1.IPCS.DIRECTRY' NOCONFIRM IPCS NOPARM SETDEF DDNAME(SYSUT1) NOCONFIRM GTF USR(FEF) END DELETE 'TMP1.IPCS.DIRECTRY' CLUSTER //
GTF制御文を指定すればトレースデータをフォーマットして印刷できます。VTAMのようにUSRイベントとしてトレースされたものはサンプルのようにUSRパラメーターを指定します。SVCやI/Oなどのシステムトレースの場合、GTF採取時にフィルタリングしていれば、単に GTF と書けばデータセット内の全レコードがフォーマットされます。
トレースデータのフォーマットJCLサンプル(MSP,VOS3)
// JOB Statement //PRDMP EXEC PGM=JQLPRDMP|JSLDMPR //SYSPRINT DD SYSOUT=* //PRINTER DD SYSOUT=* //TRACE DD DISP=SHR,DSN=SYS1.TRACE //SYSUT1 DD UNIT=SYSDA,SPACE=(CYL,(20,10)) //SYSIN DD * EDIT DDNAME=TRACE,SVC=(48,56) EDIT DDNAME=TRACE,USR=ALL END //
関連マニュアル
MVS 「zOS MVS:診断のツールと保守援助プログラム」
MVS 「zOS MVS:対話式問題管理システム(IPCS)コマンド」
MSP 「サービスエイド 使用手引書」
VOS3 「システム支援」