ダンプリスト解析入門⑤

By 神居 - Posted: 2012/10/19 Last updated: 2012/10/19 - Leave a Comment

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

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

PRB: 009CEF98
         -0020  XSB...... 7FFFEE10  FLAGS2... 00        RTPSW1... 00000000  00000000
         -000C            00000000  FLAGS1... 00000000  WLIC..... 0002002F
         +0000  RSV...... 00000000  00000000            SZSTAB... 00110082  CDE...... 009EC6D8
         +0010  OPSW..... 078D0000  87500EDE            SQE...... 00000000  LINK..... 009EC080
                          ~~~~~~~~~~~~~~~~~~
                          割り込み発生時のPSW(IRBで非同期出口ルーチンが実行された時のPSW)

         +0020  GPR0-3... FD000008  00006FF8  00000040  009D29D4
         +0030  GPR4-7... 009D29B0  009EC818  009C1FE0  FD000000
         +0040  GPR8-11.. 009EC6F8  009ECAD8  00000000  009EC818
         +0050  GPR12-15. 00EE7A2A  00006F60  009EC744  009EC728

                64-BIT GPRS FROM THE RB/XSB
         LEFT HALVES OF ALL REGISTERS CONTAIN ZEROS
          0-3  FD000008  00006FF8  00000040  009D29D4
          4-7  009D29B0  009EC818  009C1FE0  FD000000
          8-11 009EC6F8  009ECAD8  00000000  009EC818
         12-15 00EE7A2A  00006F60  009EC744  009EC728
         +0060  RSV...... E3C5D4D7  D5C1D4F0

IRB: 009EC278
         -0020  XSB...... 7FFFEC20  KEYSTA... 00        FLAGS2... 00
         -0010  RTPSW2... 00000000  00000000            FLAGS1... 00000000  WLIC..... 000200CA
         +0000  PPSAV.... 8F9CDFA8
         +0004  APSW..... 00000000  SZSTAB... 0013404E  EPA...... 87500F5E  OPSW..... 078D0000  87500F60
         +0018  IQE...... 009EC2D8  LINK..... 009CEF98
         +0020  GPR0-3... 93000000  11111111  22222222  33333333 --+
         +0030  GPR4-7... 44444444  55555555  66666666  77777777   +--> 割り込み発生時の汎用レジスター
         +0040  GPR8-11.. 88888888  99999999  AAAAAAAA  BBBBBBBB   I   (IRBで非同期出口ルーチンが
         +0050  GPR12-15. 07500E40  87500E50  80FC8308  00000000 --+     実行された時のGPR)
                                                                        非同期出口ルーチンが終了すると、
                64-BIT GPRS FROM THE RB/XSB                             ここからレジスターが復元される。
         LEFT HALVES OF ALL REGISTERS CONTAIN ZEROS
          0-3  93000000  11111111  22222222  33333333
          4-7  44444444  55555555  66666666  77777777
          8-11 88888888  99999999  AAAAAAAA  BBBBBBBB
         12-15 07500E40  87500E50  80FC8308  00000000
         +0060                      RBNEXAV.. 00000000
Posted in ダンプ解析入門 • • Top Of Page