05.2ダンプの書き出しとトレースの記録(SNAPとGTRACE)

By 神居 - Posted: 2008/11/21 Last updated: 2009/12/11 - Leave a Comment
印刷用ページの表示 印刷用ページの表示

プログラム(リージョン)のダンプを取得するにはDUMPオプション指定のABENDマクロを発行する方法があります。しかしABENDマクロではプログラムの実行はそこで終わってしまいます。プログラムを終わらせずにダンプを取るには自らストレージの内容を編集してデータセット(SYSOUT)に書き出すこともできますが、SNAPサービスを使えば簡単にダンプを取ることができます。またダンプはエラーが起きた時点でのスポットな診断情報ですが、エラーの内容によっては、プログラムの動きやデータの変化を時系列に記録したい場合があります。これはトレースと呼ばれます。トレースもGTRACEマクロで簡単に記録することができます。


プログラムの状態やストレージの内容をダンプする

SNAPマクロはストレージ・ダンプを取得します。ダンプリストはDCBパラメーターで指定したDD文で定義したデータセットに書き込まれます。サンプルではDD名SNAPDUMPとしていますが任意の名前でかまいません。SNAPマクロ発行前に出力先データセットはあらかじめOPENしておかなければなりません。ダンプの出力が終わったらCLOSEします。DCBはサンプルのように定義します。サンプルでは各マクロ命令のエラーをチェックしていませんが、必要に応じてエラー処理を組み込みます。

1番目のサンプルは自分のプログラム領域をダンプする例です。ただしGETMAINした領域はダンプされません。GETMAINした領域のダンプが必要な場合は、PDATAパラメーターにSPLSを追加します。
2番目のサンプルは自分のプログラム領域を含めリージョン全体をダンプする例です。OSのコントロールブロックはフォーマットされるだけでなく、割り当てられている領域自体も出力されます。SDATAおよびPDATAパラメーターはMVSの例です。MSPとVOS3では若干異なるのでマニュアルで確認して下さい。
3番目のサンプルは指定したストレージ領域をダンプする例です。ダンプしたい領域の開始および終了アドレスを指定しています。
4番目のサンプルも指定したストレージ領域をダンプする例です。ダンプしたい領域の開始および終了アドレスをパラメーターではなく、リストで指定しています。リストはダンプしたい領域の開始・終了アドレスのペアーを複数個並べたものです。(ラベルSTORLIST)この例では3つの領域をダンプするので開始・終了アドレス×3で6ワードを使います。SNAPルーチンが最後のエントリーを判別するため、最終エントリーの終了アドレスの先頭ビットを1に設定します。MVSではSTRHDRパラメーターでダンプする領域に対応する見出し文字列を指定することもできます。見出しは1バイトの長さ+タイトル文字列で構成されます。

OSのスーパーバイザー・ルーチンや出口ルーチンなどでダンプを取る場合は、SNAPマクロではなく、SDUMPマクロを使いSYS1.DUMPnnデータセットにSVCダンプを書き出します。システムプログラムであっても起動JCLがあればDD文が定義できますから、SNAPマクロは利用されます。しかしOS出口ルーチンのように不特定の空間で動作するものやシステム空間で動作するものはDD文を定義できませんので、SDUMPサービスによるSVCダンプが使われます。SDUMPマクロはAPF許可プログラムやスーパーバイザーモードのプログラムでなければ利用できません。


GTFにトレースレコードを書き込む

GTRACEマクロはGTFトレースデータセットに、ユーザートレースレコードを書き込みます。OPENもCLOSEもDCBも必要ありませんし、ある意味QSAMより簡単です。書き込み可能なデータの長さはOSによって異なります。(サンプルコードを見て下さい)VOS3では正式なマクロ名はETRACEですが、GTRACEでも利用できます。

トレースレコードを書き込むにはEID(EVENT ID)を決める必要があります。ユーザープログラムでは0?1023が指定できます。特に規約などがなければ1023でいいでしょう。FIDと言う、レコードを編集するときの識別番号(編集するプログラムを決める識別子)もありますが省略してかまいません。(FID=0とする)この場合IPCSやPRDMPでフォーマットする際、レコード内容はダンプ形式に編集されます。文字で構成されたレコードなら、わざわざOSのユーティリティでフォーマットしなくても、GENERでSYSOUTにコピーしても判別することができます。
正しく書き込めればGR15に復帰コード0が返ります。復帰コード4はGTFが起動されていないことを示します。8以上は基本的にパラメーターエラーです。復帰コードが32の場合、書き込むデータがページアウトされていたことを示します。これを防止するにはパラメーターPAGEIN=YESを指定します。(MVSとVOS3のみ)トレースデータ領域がページアウトされていた場合、ページインして書き込めるまでリトライします。絶対にロストしたくないレコードならPAGEIN=YESを指定します。よほどページングがヘビーなシステムでなければGTRACEを発行する前に書き込むデータを作るか触るかしておけば大丈夫でしょうが、気になる方は指定して下さい。マクロの展開形を見ればわかりますが、復帰コードが32ならデータ領域を一旦参照して(ページインされる)から書き込みをリトライします。

GTFにレコードを書くのは実は簡単です。MC命令で直接書き込むことができます。(実際はプログラム割込み:モニターイベントを起こし、割込みハンドラー経由でGTF空間にトレース書き込みを依頼する)わざわざGTRACEマクロを使わなくても直接CPU命令で行ってもかまいません。2番目のサンプルがGTRACEを使わず直接命令で行うものです。問題プログラム状態で利用できます。MVSではGTRACEマクロはAPF許可プログラム用のAPIマニュアルに記載されていますが、実際はAPF許可は不要です。
GTFの起動方法は以下にサンプルを示します。USR=3FFの3FFはEID=1023の16進数指定です。GTFに関してはマニュアルあるいはGTFトレースの採取とフォーマットを参照して下さい。

Posted in .基礎編 • • Top Of Page