プログラム(リージョン)のダンプを取得するには、DUMPオプション指定のABENDマクロを発行する方法があります。しかし、ABENDマクロではプログラムの実行はそこで終わってしまいます。プログラムを終わらせずにダンプを取るには、自ら記憶域の内容を編集してデータセット(SYSOUT)に書き出すこともできますが、SNAPサービスを使えば簡単にダンプを取ることができます。また、ダンプはエラーが起きた時点でのスポットな診断情報ですが、エラーの内容によってはプログラムの動きやデータの変化を時系列に記録したい場合があります。これはトレースと呼ばれます。トレースもGTRACEマクロで簡単に記録することができます。
プログラムの状態や記憶域の内容をダンプする
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
----+----1----+----2----+----3----+----4----+----5----+----6----+----7-- OPEN (SNAPDCB,OUTPUT) OPEN SNAPDUMP DATASET L R2,=F'10000' LOAD GETMAIN SIZE GETMAIN R,LV=10000 OBTAIN WORKING STORAGE LR R0,R1 LR R1,R2 L RF,=A(X'C8000000') LOAD PAD CHAR = C'H' MVCL R0,RE INITIALIZE STORAGE AREA ① SNAP DCB=SNAPDCB, DO STORAGE DUMP FOR OUR PROGRAM+ SDATA=(CB),PDATA=(PSW,REGS,SA,JPA) ② SNAP DCB=SNAPDCB, DO STORAGE DUMP FOR OUR REGION + SDATA=(LSQA,SWA,DM,CB,TRT,ERR,SUM), + PDATA=(PSW,REGS,SA,JPA,SPLS) ③ LA R2,DATAAREA LOAD BEGIN STORAGE ADDRESS LA R3,DATAAREA+L'DATAAREA-1 LOAD ENDED STORAGE ADDRESS SNAP DCB=SNAPDCB, DO STORAGE DUMP FOR SPECIFIED + STORAGE=((2),(3)) RANGE BY GR2 AND GR3 MVI DATA1,C'A' MVC DATA1+1(L'DATA1-1),DATA1 PAD WORKAREA BY C'A' MVI DATA1+24,C'Z' MVI DATA1+64,C'Z' MVI DATA1+104,C'Z' MVI DATA2,C'B' MVC DATA2+1(L'DATA2-1),DATA2 PAD WORKAREA BY C'B' MVI DATA2+24,C'Z' MVI DATA2+44,C'Z' MVI DATA3,C'C' MVC DATA3+1(L'DATA3-1),DATA3 PAD WORKAREA BY C'C' MVI DATA3+24,C'Z' MVI DATA3+54,C'Z' MVI DATA3+80,C'Z' SPACE , LA R1,STORLIST LOAD STORAGE LIST LA R0,DATA1 LOAD SNAP AREA-1 ST R0,0(,R1) SET IT IN STORAGE LIST LA R1,4(,R1) LOCATE TO NEXT ENTRY LA R0,DATA1+L'DATA1-1 LOAD END OF SNAP AREA-1 ST R0,0(,R1) SET IT IN STORAGE LIST LA R1,4(,R1) LOCATE TO NEXT ENTRY SPACE , LA R0,DATA2 LOAD SNAP AREA-2 ST R0,0(,R1) SET IT IN STORAGE LIST LA R1,4(,R1) LOCATE TO NEXT ENTRY LA R0,DATA2+L'DATA2-1 LOAD END OF SNAP AREA-2 ST R0,0(,R1) SET IT IN STORAGE LIST LA R1,4(,R1) LOCATE TO NEXT ENTRY SPACE , LA R0,DATA3 LOAD SNAP AREA-3 ST R0,0(,R1) SET IT IN STORAGE LIST LA R1,4(,R1) LOCATE TO NEXT ENTRY LA R0,DATA3+L'DATA3-1 LOAD END OF SNAP AREA-3 ST R0,0(,R1) SET IT IN STORAGE LIST OI 0(R1),X'80' INDICATE HERE IS LAST ENTRY SPACE , ④ SNAP DCB=SNAPDCB, DO STORAGE DUMP FOR SPECIFIED + LIST=STORLIST,STRHDR=HDRLIST RANGE BY STORAGE LIST CLOSE (SNAPDCB) CLOSE SNAPDUMP DATASET : : *---------------------------------------------------------------------* DS 0F DATAAREA DC XL256'00' DATA AREA DATA1 DC XL128'00' DATA AREA-1 DATA2 DC XL64'00' DATA AREA-2 DATA3 DC XL96'00' DATA AREA-3 *---------------------------------------------------------------------* STORLIST DC 6A(0) SNAP STORAGE LIST HDRLIST CALL ,(HDR1,HDR2,HDR3),VL, SNAP STORAGE TITLE LIST + MF=L HDR1 DC AL1(L'HDR1TXT) HDR1TXT DC C'DATA AREA-1(TEST DATA AREA-1)' HDR2 DC AL1(L'HDR2TXT) HDR2TXT DC C'DATA AREA-2' HDR3 DC AL1(L'HDR3TXT) HDR3TXT DC C'DATA AREA-3: WORK AREA FOR PROCESSING.' *---------------------------------------------------------------------* SNAPDCB DCB DDNAME=SNAPDUMP, SNAP DATASET DCB + DSORG=PS,MACRF=W, + RECFM=VBA,BLKSIZE=1632,LRECL=125 追加するJCL DDステートメント //SNAPDUMP DD SYSOUT=* |
SNAPマクロは、記憶域ダンプを取得します。ダンプ・リストは、DCBパラメーターで指定したDDステートメントに定義したデータセットに書き込まれます。サンプルでは、DD名SNAPDUMPとしていますが任意の名前でかまいません。SNAPマクロ発行前に、出力先データセットは予めOPENしておかなければなりません。ダンプの出力が終わったらCLOSEします。DCBは、サンプルのように定義します。サンプルでは、各マクロ命令のエラーをチェックしていませんが必要に応じてエラー処理を組み込みます。
1番目のサンプルは、自分のプログラム領域をダンプする例です。ただし、GETMAINした領域はダンプされません。GETMAINした領域のダンプが必要な場合は、PDATAパラメーターにSPLSを追加します。
2番目のサンプルは、自分のプログラム領域を含めリージョン全体をダンプする例です。OSのコントロール・ブロックは、フォーマットされるだけでなく割り当てられている領域自体も出力されます。
3番目のサンプルは、指定した記憶域をダンプする例です。ダンプしたい領域の開始および終了アドレスを指定します。
4番目のサンプルも、指定した記憶域をダンプする例です。ダンプしたい領域の開始および終了アドレスを、パラメーターではなくリストで指定しています。リストは、ダンプしたい領域の開始アドレスと終了アドレスの対を複数個並べたものです(ラベルSTORLIST)。この例では、3つの領域をダンプするので開始と終了アドレス×3で6ワードを使います。SNAPルーチンが最後のエントリーを判別するため、最終エントリーの終了アドレスの先頭ビットを1に設定します。STRHDRパラメーターで、ダンプする領域に対応する見出し文字列を指定することもできます。見出しは、1バイトの長さ+タイトル文字列で構成されます。
OSのスーパーバイザー・ルーチンや出口ルーチンなどでダンプを取る場合は、SNAPマクロではなくSDUMPマクロを使いSYS1.DUMPnnデータセットにSVCダンプを書き出します。システム系のプログラムであっても、起動JCLがあるならDDステートメントが定義できますからSNAPマクロは利用できます。しかし、OS出口ルーチンのように不特定の空間で動作するものやシステム空間で動作するものはDDステートメントを定義できませんので、SDUMPサービスによるSVCダンプが使われます。SDUMPマクロは、APF許可プログラムやスーパーバイザー・モードのプログラムでなければ利用できません。
GTFにトレースレコードを書き込む
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
----+----1----+----2----+----3----+----4----+----5----+----6----+----7-- LA R2,TRECORD1 LOAD TRACE RECORD ADDRESS LA R3,L'TRECORD1 LOAD TRACE RECORD LENGTH GTRACE ID=1023, PUT GTF RECORD VIA GTRACE MACRO+ DATA=(2),LNG=(3) MAX LENGTH = 8192byte CH RF,=H'4' GTF IS NOT ACTIVE ? BE GTFINACT YES, IGNORED TRACE RECORD BH GTFERROR MAY BE GTF PARAMETER ERROR : : LA R0,TRECORD2 LOAD GTF RECORD DATA ADDRESS ST R0,GTFPARM+4 SET IT IN PLIST LA R0,L'TRECORD2 LOAD GTF RECORD DATA LENGTH STH R0,GTFPARM SET IT IN PLIST LA R1,GTFPARM GR1 --> GTF PLIST LA RF,4 PUT GTF NOT ACTIVE CODE IN GR15 MC 1023,X'0E' MONITOR CALL FOR GTRACE + GR1 --> +00: AL2(LNG),AL2(FID) + +04: A(TRACE DATA) : : * GTFPARM DS 0F 2WORD PLIST DC AL2(0) DATA LENGTH DC AL2(0) FID(FORMAT ID) = 0 DC A(0) DATA ADDRESS * TRECORD1 DC C'AAAAAAAAAAAAAAAAAAA' TEST GTF DATA1 TRECORD2 DC C'BBBBBBBBBBBBBBBBBBBBB' TEST GTF DATA2 |
GTRACEマクロは、GTFトレース・データセットにユーザー・トレース・レコードを書き込みます。OPENもCLOSEもDCBも必要ありませんし、ある意味QSAMより簡単です。
トレース・レコードを書き込むには、EID(EVENT ID)を決める必要があります。ユーザー・プログラムでは、0~1023が指定できます。特に規約などがなければ1023でいいでしょう。FIDというレコードを編集するときの識別番号(編集するプログラムを決める識別子)もありますが、省略してかまいません(FID=0とする)。この場合、IPCSでフォーマットする際にレコード内容はダンプ形式に編集されます。文字で構成されたレコードなら、わざわざOSのユーティリティでフォーマットしなくてもGENERでSYSOUTにコピーしても判別することができます。
GTRACEマクロでは、データが正しく書き込めればGR15に復帰コード0が返ります。復帰コード4は、GTFが起動されていないことを示します。8以上は基本的にパラメーター・エラーです。復帰コードが32の場合、書き込むデータがページ・アウトされていたことを示します。これを防止するには、パラメーターPAGEIN=YESを指定します。トレースデータ領域がページ・アウトされていた場合、ページ・インして書き込めるまでリトライします。絶対にロストしたくないレコードならPAGEIN=YESを指定します。よほどページングがヘビーなシステムでなければ、GTRACEを発行する前に書き込むデータを作るか触るかしておけば大丈夫でしょうが気になる方は指定して下さい。マクロの展開形を見ればわかりますが、復帰コードが32ならデータ領域を一旦参照して(ページインされる)から書き込みをリトライします。
GTFにレコードを書くのは実は簡単です。MC命令(*1)で直接書き込むこともできます。わざわざGTRACEマクロを使わなずに、直接CPU命令で行ってもかまいません。2番目のサンプルが、GTRACEを使わず直接命令で行うものです。問題プログラム状態でも利用できます。MVSでは、GTRACEマクロはAPF許可プログラム用のAPIマニュアルに記載されていますが、利用に際してAPF許可は不要です。
GTFの起動方法は以下にサンプルを示します。USR=3FFの3FFは、EID=1023の16進数指定です。GTFに関してはマニュアルあるいはGTFトレースの採取とフォーマットを参照して下さい。
S GTF.GTF
R nn,TRACE=USRP
R nn,USR=3FF,END
R nn,U