サービス概説
BREAK SVCは走行中プログラムの実行を中断して、オペレーターに通知する、アセンブラー・プログラムのデバッグ機能です。
中断したプログラムのPSWおよびGPR(汎用レジスター)の内容は、メッセージでTSO端末またはコンソールのいずれかに通知されます。
実行中プログラムがTSOで実行されている場合、メッセージはログオン中のTSO端末に送られます。バッチ空間で実行中のジョブまたはSTCタスクの場合、メッセージはオペレーター・コンソールに送られますが、別のプログラム製品である「SV(Storage Viewer)」のBMON(Break Monitor)機能がアクティブな時は、コンソールへのメッセージ出力の代わりに、ブレーク情報をBMON(Break Monitor)に通知します。これによって中断プログラムのデバッグを、SVパネルで対話的に行うこともできます。
BREAK SVCはメッセージの通知と共に、オペレーターからの応答を待ち受けます。
端末に表示されたリプライプロンプト(>>>)(コンソールの場合はリプライメッセージ)にコマンドを応答することで、実行中断時のレジスター内容を表示したり、プログラムが実行している空間内のメモリー内容の表示や書き換えを行うこともできます。ブレークモニターがアクティブな時は、リプライ応答の代わりに、SVパネルにコマンドを入力します。
SVCモジュール(SVCBREAK)
BREAK SVCを利用して、プログラムの実行を中断するためには、SVC命令を発行します。標準のSVC番号は「202」です。
BREAK SVCはアセンブラー言語プログラムからのみ呼び出すことができます。BREAK SVCはオブジェクトモジュールの形式で提供されます。
環境
最低限の許可 | 問題プログラム状態および任意のPSWキー。 |
タスク指名可能単位モード | タスク・モード。 |
仮想記憶間モード | PASN=HASN=SASN |
AMODE | 24ビットまたは31ビット・モード。 |
ASCモード | 基本モード。 |
割込み状況 | 入出力割込みおよび外部割込みのときに割込み可能である。 |
ロック | 要件なし(ロックをかけない)。 |
プログラミングの要件
なし。
制約事項
なし。
パフォーマンス上の含意
なし。
入力レジスター情報
SVC命令を出す前に、呼出し側はどのレジスターにも情報を入れる必要はありません。
出力レジスター情報
制御が呼び出し側に戻るとき、汎用レジスター(GPR)には以下のものが入っています。
GPR | 内容 |
---|---|
0〜15 | 呼び出し時の値のまま変更されません。 |
戻りコード/理由コード/ABENDコード
BREAK SVCは戻りコードおよび理由コードを返しません。
また自らABENDすることもありません。
インストール
- オブジェクト・モジュールのアップロード
- ロードモジュールのリンケージ
提供されたオブジェクト・モジュール「SVCBREAK.obj」、「GCPMWTR.obj」および「GCPIDAP.obj」を、任意の区分データセットにバイナリー転送でアップロードします。
アップロード先の区分データセットは、DCB=(RECFM=FB,BLKSIZE=80の倍数,LRECL=80)のDCB情報を持っていなければなりません。
アップロードされたオブジェクト・モジュールを入力にして、バインダー・ユーティリティを実行し、BREAK SVCのロードモジュールを生成します。
ロードモジュールは、ユーザーSVCとして登録する必要があるので、SYS1.LPALIB、SYS1.LINKLIBまたはユーザー・リンクライブラリーに格納します。メンバー名は、OSのSVCモジュールの命名規約に従って決定します。SVC 202番であれば「IGC0020B」となります。
//LKED EXEC PGM=IEWL,PARM='LIST,MAP,XREF,NCAL,RENT,RMODE=ANY' //SYSPRINT DD SYSOUT=* //SYSLMOD DD DISP=SHR,DSN=USR1.LINKLIB(IGC0020B) //SYSLIN DD DISP=SHR,DSN=TMP1.OBJECT(SVCBREAK) // DD DISP=SHR,DSN=TMP1.OBJECT(GCPMWTR) // DD DISP=SHR,DSN=TMP1.OBJECT(GCPIDAP) //
SYS1.PARMLIB内のIEASVCnnにBREAK SVCに割り当てたSVC番号を登録します。
IEASVCnnのメンバー名サフィックスは、IEASYSnnメンバー内のSVCパラメーターによって関連づけられます。
----+----1----+----2----+----3----+----4----+----5----+----6----+----7-- SVCPARM 202,REPLACE,TYPE(3),EPNAME(IGC0020B) /* BREAK SVC */
ロードモジュールをリンクライブラリーに登録した場合は、モジュールをMLPAにローディングさせるため、SYS1.PARMLIB内のIEALPAnnにBREAK SVCのロードモジュール名をを登録します。
IEALPAnnのメンバー名サフィックスは、IEASYSnnメンバー内のMLPAパラメーターによって関連づけられます。
----+----1----+----2----+----3----+----4----+----5----+----6----+----7-- INCLUDE LIBRARY(USR1.LINKLIB) MODULES( IGC0020B /* BREAK SVC ROUTINE */ )
OSを再IPLすることで、登録したSVCルーチンが使用できるようになります。
SVCモジュールの命名規則、PARMLIBメンバーの説明等、詳細は、z/OS MVS初期設定およびチューニング解説書(SA88-8564)を参照。
操作方法
- BREAK SVCの埋め込み
実行を中断させたい箇所に、BREAK SVCのSVC命令を記述します。
※直接、SVC命令を記述します。EX命令による、間接実行はサポートしていません。
----+----1----+----2----+----3----+----4----+----5----+----6----+----7-- OPEN (SYSUT1,INPUT) SVC 202 LTR R15,R15 BZ .......
BREAK SVCが発行されると、プログラムの実行は中断され、中断時のPSWおよび汎用レジスター(GPR)の内容がオペレーターに通知されます。
BRK900I JOB=TESTJOB1/TESTPGM1 PSW=078D0000 80006FFA RB=00ADB6C0 BRK901I GR00=FD00000B GR01=00005FF0 GR02=00000040 GR03=00ADD954 BRK902I GR04=00ADD930 GR05=00ADBB68 GR06=00ABAFF8 GR07=FD000000 BRK903I GR08=00AFD038 GR09=00ADBD30 GR10=00000000 GR11=00ADBB68 BRK904I GR12=00006F98 GR13=80006FA8 GR14=80FD8F70 GR15=00005FA0
BRK900Iメッセージは、ブレークしたプログラムのジョブ名とプログラム名(ブレークしたタスクのTCBが示す、先頭RBにチェインされているCDEから得ています)、およびPSWとRBアドレスを表示します。BRK901〜904Iメッセージは、ブレーク時点の汎用レジスター(GPR)の内容を表示します。
ブレークモニター(Storage ViewerのBreak Monitor)機能がアクティブな時は、メッセージではなく、実行中の「Storage Viewer」がブレークパネルに切り替わり、PSWとGPR内容、およびブレーク時のPSWが示すメモリーの内容がパネルに表示されます。詳細は「Storage Viewer」のドキュメントを参照して下さい。
BREAK SVCはブレーク時のPSWとGPR内容を表示して、コマンド入力待ちになります。
モニターユーザー(TSOまたはJCLに指定されたUSERID)がアクティブであれば、PSWとGPR表示に続き、次のプロンプトが表示され、
>>> ■
モニターユーザーがいないか、アクティブでなければ、コンソールに次のリプライ・メッセージが表示されます。
nn BRK999I JOB=TKWORK WAS INTERRUPTED, ENTER COMMAND OR GO
プロンプトまたはリプライ・メッセージに、コマンドを応答することで、プログラムの実行再開、メモリー内容の表示・変更の操作を行います。
※ブレークしたプログラムがJOBまたはSTCで、メッセージがTSOのモニターユーザーに送られる場合、BREAK SVCはTSOユーザー空間のJOB STEP TASK(TMP)タスクに、IRBルーチンの実行をスケジュールします。そのIRBルーチン内で、リプライ・プロンプトからの入力を行うためTGETを発行します。TMPもしくはISPFもすでにTGETを発行しているため、タイミングによっては、プロンプトへの入力が、TMPまたはISPF側に渡されてしまい、画面のI/Oエラーを起こす場合があります。不要な空エンターなどを行わないようにします。プロンプトを見失ったような場合は、CLEARキーで画面をクリアーしてから、改めて GO または D * を入力してみます。
ブレークモニター(Storage ViewerのBreak Monitor)機能がアクティブな時は、「Storage Viewer」がブレークパネル上で操作を行います。
応答コマンド
G [o] コマンド
プログラムの実行を再開します。PSWが示す命令アドレスから-2バイトの位置にある命令が、BREAK SVC命令のままであれば、PSWが示す命令アドレスから実行を再開します。書き換わっている場合は、PSWが示す命令アドレス-2バイトの位置から実行を再開します(書き換えられた命令からの再実行)。
D [ump] コマンド
ブレークしたプログラムのアドレス空間内のメモリー領域の内容をダンプします。
D address [length]
addressにダンプを開始するメモリーのアドレス、lengthにダンプする長さを指定します。長さの省略値は32バイトです。指定したアドレスの仮想ストレージが存在しない場合は、エラーメッセージが表示されます。ダンプの途中で有効な仮想ストレージの終わりに達した時は、そこまでのメモリー内容が表示されます。
間接アドレス表記
アドレスの指定には、16進数によるアドレス表記の他に、間接アドレス表記が使用できます。(OSのSLIPコマンド、TSOのTESTコマンドに準拠)
[address][.][+|-displacement][%|?] nR%|?[+|-displacement][%|?]
16進数表記のアドレス(16進アドレスを示す、区切りのピリオド文字はあってもなくてもかまいません)に加え、+|-による16進数の変位(オフセット)、%|?によるアドレスポインターが指定できます。変位とアドレスポインターは連続して表記することもでき、左から右に向かって順番に解釈されていきます。
アドレスポインター「%」は、24ビットアドレスとして解釈され、アドレスが示すフルワード領域の下位3バイトが次のアドレスとして読み込まれます。[?]は31ビットアドレスとして解釈され、フルワード領域の31ビットが次のアドレスとして読み込まれます。
例1)1000% ⇒ x1000番地から始まる4バイトの領域の下位3バイト(x1001番地から3バイト)の値が読み込まれ、その値がダンプアドレスになります。x1000番地を表示するのではなく、x1000番地にはアドレスが格納されたポインター領域と見なされ、そこに格納された値がダンプアドレスとなります。x1000番地にxA60038F0が格納されている場合、x0038F0がアドレス値となります。
例2)2000+10? ⇒ x2000+x10でx2010番地から始まる4バイトの領域の値が読み込まれ、その値がダンプアドレスになります。(31ビットアドレス)
変位またはアドレスポインターを指定する場合、addressは省略可能で、その場合、前回のダンプ開始アドレスが暗黙のaddress値になります。
D +10 は前回のダンプ開始アドレスにx10を加えたアドレスになります。
16進数表記のaddressの代わりに、nRの形式で、アドレス値が格納されたレジスター番号を指定することもできます。nは0〜15のレジスター番号です。GPR1に格納された値をアドレスとする場合は、1R、GPR12に格納された値をアドレスとする場合は、12R、と指定します。12R+18? とすれば、GPR12に格納された値に、x18を加えたアドレスの領域に格納されている、フルワードの内容が読み込まれ、31ビットのアドレス値となります。
- *
- CVT
- ASCB
- TCB
- RB
- RH
- PSW
- GRnn
ニーモニック・アドレス表記
カレントアドレスを示します。カレントアドレスとは前回のDまたはAコマンドで指定されたアドレスを再使用することを意味します。
CVTを表示します。
ASCBを表示します。
TCBを表示します。
RBを表示します。
RBをプレフィックス部から表示します。
PSWアドレスが示す領域を表示します。
指定した汎用レジスター(GPR)内容が示す領域を表示します。
A [lternate] コマンド
ブレークしたプログラムのアドレス空間内のメモリー領域の内容を書き換えます。
A address newdata
addressに書き込みを行うメモリーのアドレス、newdataに新しいデータを16進文字で指定します。指定したアドレスの仮想ストレージが存在しない場合や、プロテクトされている領域の場合は、エラーメッセージが表示されます。
再開後のプログラムの動きを変える目的で、デバッグ中プログラムの領域内容を書き換えることができます。またループの途中にBREAK SVCを埋め込んだ場合など、BREAK SVC命令をNOPR命令に書き換えることにより、ループ内でのブレーク動作を解除することができます。