ダンプ・リスト解析入門 ⑤:ダンプ解析に関連するOSコントロール・ブロック①

ダンプリストには、レジスター内容と関連する仮想記憶域の内容だけでなく、OSのさまざまなコントロール・ブロックが編集されて出力されます。これらもプログラムABEND時の原因究明のための有用な調査用資料になります。数多くのサブルーチンを動的にローディングしている、マルチ・タスキングで並行処理を行っている、OSのさまざまなAPIを使用している、などプログラムの構造や処理が複雑になるにつれ、OSのコントロール・ブロックはプログラムがどのような状態になっていたかを示す欠かせない情報になります。

RB(PRB、SVRB、IRB)

RB(Request Block)は、タスクで実行中のプログラムを管理するコントロール・ブロックです。OSは、システム制御のためのさまざまなリソースをコントロール・ブロックによって管理、制御しています。アドレス空間にはASCB、空間内のタスクにはTCB、タスクで実行されるプログラムにはRBが使われます。単純なプログラムではOSのコントロール・ブロックなど気にしなくてもデバッグできることが多いですが、このシリーズの「ダンプ・リスト解析入門②:ABEND箇所を特定する」でも紹介したように、ABEND時のPSWが自分のプログラム内を指していないような場合は、RBを参照することで複数プログラム間における制御の移り変わりの状況がわかります。
多くのコントロール・ブロックを理解する必要はありませんが、少なくともRBぐらいは知っておくといいでしょう。また、OSの出口ルーチンなどではプログラム処理を行う際に、OSのコントロール・ブロックを参照することで必要な情報を得ている場合もあります。基本的なコントロール・ブロックのアウトラインだけでも知っておけば応用が利きます。

RBには3つの種類があります。1つ目はPRB(Program Request Block)で、LINKやATTACHなどスーパーバイザー経由で呼び出されるプログラムに対して作成されます。EXECステートメントのPGMパラメーターで指定されたプログラムにもPRBが作成されます。2つ目がSVRB(SuperVisor Request Block)でSVCルーチンに対して作成されます。すべてのSVCについて作成されるのではなく、タイプ2、3及び4のSVCルーチンだけがSVRBを持ちます。3つ目がIRB(Interrupt Request Block)で、非同期出口ルーチンに対して作成されます。例えば、ESTAE出口ルーチンはESTAEを発行したプログラムがABENDすると制御を受け取りますが、この時OSはESTAE出口ルーチンを割り込んで実行するためにIRBを作成します。

RBの主なフィールド
オフセット フィールド名 意味、内容
-x20 RBXSB RBに入りきらない制御情報を格納するXSBへのポインター
アクセスレジスターや64ビットレジスターの上位ワードなどはこちらに退避される。
-x03 RBINLNTH 割込み時の命令長
-x02 RBINTCOD 割込みコード
(SVC番号やプログラム割込みコード)
+x00 RBBASIC RB基本部の先頭
+x08 RBSIZE RBの長さ(ダブルワード数)
+x0A RBSTAB1 状況や属性を示すフラグバイト
RBタイプ
+x0B RBSTAB2 状況や属性を示すフラグバイト
x80:RBLINKはTCBを示す(タスクで最初に実行されたプログラム)
+x0C RBCDE PRB:実行中プログラムのロードモジュールを管理するCDEへのポインター
IRB:割り込んで実行されるモジュールの入口点アドレス
+x10 RBOPSW 割り込み発生時のPSW
+x1C RBLINK 1つ前のRBのアドレス
+x20 RBGRSAVE 割り込み発生時の汎用レジスターの内容(GR0からGR15)
(直前のRBで実行中のプログラムのもの)
+x60 RBEXSAVE SVCルーチン用作業域(SVRBの場合で48バイト分)

RBにはPSWとレジスターの退避領域があります。MVSでは複数のアドレス空間やタスクの実行が次々に切り替えられて制御されますが、これらは割込みによって行われています。割込みが起きると、実行中のプログラムのRBにPSWが退避され、割込みによって実行される新しいプログラムのRBに割込み時に実行していたプログラムのレジスター内容が退避されます。PSWとレジスターは同じRBに退避されるのではないことを理解します。
例えば、プログラムがSVC命令を実行すると、SVC割込みが発生してPSWはPRBに退避され、レジスターはSVCルーチン用に作成されるSVRB(次のRB)に退避されます。STIMERマクロでタイマー設定中であれば、設定した時間が経過すると実行中のプログラムの実行を中断してタイマー出口ルーチンを実行するためにIRBが作成されます。実行中プログラムのPSWがPRBに退避され、レジスター内容はIRBに退避されます。RBを順番にたどることで、割り込み発生時のPSWとレジスター内容を追跡することができます。