ダンプの採取とフォーマット
ダンプとはプログラムおよびプログラムが使用しているメモリー上のデータを、診断のためにデータセットに書き出したものです。プログラムが動いているジョブのアドレス空間のメモリー内容が出力されます。
MVSではプログラムが異常終了した時や、固まって動かなくなってしまった時(WAITやLOOP)はメモリーダンプを採って、そのダンプリストを基に異常の原因を調査することがよく行われます。アプリケーションの場合は使用する言語プログラム(COBOLやPL/Iなど)のデバッグ機能や、トランザクション処理システム(CICSやIMS)が提供する診断機能などを使いますが、アセンブラー言語で作成されたプログラムやミドルウェア製品自体に異常が起きた場合、ダンプは原因究明の重要な調査資料になります。
SYSUDUMPとSYSABEND
MVSではダンプは基本的な診断資料なので、特別な操作をしなくても必要なときに自動的に書かれます。
JCLにSYSUDUMP DD文またはSYSABEND DD文を定義すれば、プログラムが異常終了した時やCANCELコマンドでダンプの出力が指定された時に、MVSによってDD文に指定されたデータセットに出力されます。通常は出力先としてSYSOUTが指定されることが多いでしょう。
SYSUDUMPとSYSABENDには本質的な違いはなく、ダンプを採る範囲の違いによって使い分けられます。それぞれがどの範囲をダンプするかはMVSのパラメーターに定義されます。多くのユーザーではSYSUDUMPはユーザーアプリケーション用、SYSABENDはシステムプログラム用として使い分けられます。
//SYSUDUMP DD SYSOUT=D //SYSABEND DD DISP=SHR,DSN=WORK.DUMPLIST
予めダンプ出力用データセットを作成しておく場合は、PSデータセットとして容量のみを指定します。RECFM、ブロック長、レコード長はMVSがダンプ出力時に設定し直します。
ダンプする範囲
適切なダンプ範囲の設定は、無用なダンプレコードの出力を減らし、デバッグ作業の効率も向上します。
システムのデフォルト値はSYS1.PARMLIBで設定できます。
SYSUDUMP
SYSUDUMPを主にユーザープログラム用、とするならばプログラムとデータ領域、デバッグに必要な最低限のOSコントロールブロックとリカバリー制御用コントロールブロックがフォーマットされる程度の情報は必要です。
MVS(IEADMP00) SDATA=(CB,ERR),PDATA=(PSW,REGS,SA,JPA,SPLS,SUBTASKS)または SDATA=(SUM),PDATA=(PSW,REGS,SA,JPA,SPLS,SUBTASKS) MSP(KAADMP00) SDATA=(CB),PDATA=(PSW,REGS,SA,JPA,SPLS)または SDATA=(CB,LSQA,ENQ,TRT),PDATA=(PSW,REGS,SA,JPA,SPLS) VOS3(JAADMP00) SDATA=(CB),PDATA=(PSW,REGS,SA,JPA,SPLS)または SDATA=(CB,LSQA,ENQ,TRT),PDATA=(PSW,REGS,SA,JPA,SPLS)
SYSABEND
SYSABENDを主にシステムプログラム用、とするならばプログラムと空間内のすべてのサブプール、関連するLPAモジュール、ニュークリアス域を除くOSのコントロールブロック領域、デバッグ用にOSコントロールブロックとリカバリー制御用コントロールブロックがフォーマットされるようにした方がいいでしょう。システムプログラムではプログラムの処理内容によって必要な範囲にかなりの幅がありますが、足りないとダンプとして役に立たなくなるので広めの範囲を採取する方が間違いありません。必要な範囲が小さいプログラムならSYSUDUMPを利用してもいいのです。
MVS(IEAABD00) SDATA=(CB,DM,ENQ,ERR,LSQA,PCDATA,SUM,TRT,SQA,SWA,IO),PDATA=(ALLPDATA) MSP(KAAABD00) SDATA=(CB,ENQ,LSQA,PCDATA,TRT,SQA,SWA),PDATA=(ALLPDATA) MSP(JAAABD00) SDATA=(CB,ENQ,LSQA,TRT,SQA,SWA),PDATA=(ALLPDATA)
OSコマンド CD(ChngDump)を使えばダンプする範囲は一時的に変更できますから、臨機応変に対応することはできます。VOS3ではDD文でもダンプする範囲を指定できます。
//SYSUDUMP|SYSABEND DD SYSOUT=*,DUMP=(PSW,REGS,CB,SA,JPA,SPLS,RGN)
システムダンプ(SVCダンプ)
システムダンプはSVCダンプとも呼ばれ、プログラムの異常終了ではなく、オペレーターがコマンドによって採取するダンプです。アドレス空間内の仮想記憶域の内容を書き出すので、アドレス空間ダンプとも呼ばれます。ダンプデータは予めシステムに定義したダンプ・データセット(SYS1.DUMPnn)に出力されます。SYSUDUMP、SYSABENDと違ってバイナリー形式のままなので解析には専用のユーティリティを使ってフォーマットします。OSのモジュールも異常を検知した場合などに、自らこの形式のダンプを出力します。
一般のプログラムでは通常使われませんが、ミドルウェアやISV製品などでは診断資料としてよく利用されます。特にWAITやLOOPなど、プログラムが正しく動けずに止まってしまっているような状態では、アドレス空間ダンプはエラーの状態のままメモリー内容がダンプされるため、より正確な診断が可能になります。
DUMP COMM=(comment text) (ダンプ・パラメーターの入力を促すMSGが出る) nn,JOBNAME=jobname,SDATA=(PSA,RGN,SUM,TRT) ,SDATA=(PSA,RGN,SUM,TRT,CSA,LPA,SQA,NUC) ,SDATA=(RGN,TRT,CSA,LPA,SQA) MSPの場合 ,SDATA=(PSA,RGN,TRT,CSA,LPA,SQA,NUC) VOS3の場合
通常はRGNでリージョン全域を採れば十分ですが、必要に応じてCSAやLPA域を追加します。データベースのように複数の空間からのサービスを受けるようなプログラムではCSAやSQAなども必要となる場合があります。
DUMPコマンドを使用する前に、D DUMPコマンドで空きのダンプデータセットがあるかを確認します。必要ならばDD CLEAR,DSN=nnコマンドで使用済みダンプデータセットをクリアーします。(MSPとVOS3ではユーティリティによるクリアーが必要)
システムダンプのフォーマット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 BLSCPRNT JOBNAME(jobname) LIST 00FD8F20:00FD9FFF PRINT NOTERMINAL END DELETE 'TMP1.IPCS.DIRECTRY' CLUSTER //
採取されたアドレス空間内のストレージを編集し、基本的なOSのコントロールブロックをフォーマットして出力する例です。
アドレス範囲を指定してストレージ内容を編集するにはLISTコマンドを使用できます。その他のコマンドはIPCSのマニュアルを参照して下さい。
システムダンプのフォーマットJCLサンプル(MSP)
// JOB Statement //PIC EXEC PGM=KEQEFT01 //SYSUT1 DD DISP=SHR,DSN=ダンプデータセット名 //SYSTSPRT DD SYSOUT=* //IPCSPRNT DD SYSOUT=* //SYSTSIN DD * DEFINE CLUSTER(NAME('TMP1.PIC.DIRECTRY') - VOLUME(WRKVOL) UNIQUE) - DATA(NAME('TMP1.PIC.DIRECTRY.DATA') - KEYS(128 0) CYLINDERS(1 1) - CONTROLINTERVALSIZE(4096)) - INDEX(NAME('TMP1.PIC.DIRECTRY.INDEX')) ALLOC F(PICDDIR) DA('TMP1.PIC.DIRECTRY') SHR PICDDIR 'TMP1.PIC.DIRECTRY' PIC SETDEF DS('SYS1.DUMP00') STATUS REGISTERS NOTERMINAL PRINT SUMMARY JOB(jobname) REGISTERS NOTERMINAL PRINT VERBEXIT FORMAT NOTERMINAL PRINT VERBEXIT CURRENT NOTERMINAL PRINT LIST 00FD8F20.:00FD9FFF. NOTERMINAL PRINT END DELETE ('TMP1.PIC.DIRECTRY') //
システムダンプのフォーマットJCLサンプル(VOS3)
// JOB Statement //PRDMP EXEC PGM=JSLDMPR //SYSPRINT DD SYSOUT=* //PRINTER DD SYSOUT=* //TAPE DD DISP=SHR,DSN=SYS1.DUMP00 //SYSUT1 DD UNIT=SYSDA,SPACE=(CYL,(20,10)) //SYSIN DD * PRINT JOBNAME=(jobname) //
ダンプデータセットのクリアーJCLサンプル(MSP,VOS3)
// JOB Statement //PRDMP EXEC PGM=JQLPRDMP|JSLDMPR //SYSPRINT DD DUMMY //PRINTER DD DUMMY //TAPE DD DISP=OLD,DSN=SYS1.DUMP00 //SYSUT2 DD DUMMY //SYSIN DD * END //
関連マニュアル
-
MVS 「zOS MVS:初期設定およびチューニング解説書」
MVS 「zOS MVS:システム・コマンド」
MVS 「zOS MVS:対話式問題管理システム(IPCS)ユーザーズ・ガイド」
MVS 「zOS MVS:対話式問題管理システム(IPCS)コマンド」
MSP 「システムパラメタ文法書」
MSP 「コンソールコマンド文法書」
MSP 「PIC使用手引書」
MSP 「サービスエイド 使用手引書」
VOS3 「センタ運営-JSS3-文法編」
VOS3 「システム操作-JSS3編-」
VOS3 「システム支援」