PM(Program Monitor)の概要
PMは、TSO/ISPFのコマンド・シェルの基で実行されるプログラムのアクティブ・デバッガーで、TSOのコマンド・プログラムとして動作する。デバッグ対象のプログラムは、PMによって制御されるサブタスクとして実行される。
PMにはプログラムの実行を中断するブレーク機能があり、任意の位置(SVC命令(SVC 202)の埋め込み)もしくはABEND時にプログラムの実行を中断して、内蔵されたSV(Storage Viewer)機能によってその時点のPSWや汎用レジスターおよび実行中プログラムのメモリー内容がISPFパネルで表示させてインタラクティブなデバッグができる。
デバッグ・プログラムの実行(PM Operation)
PMはISPFのコマンドシェル・パネルにて起動する。コマンドPMに続き、デバッグしたいアセンブラー・プログラムのモジュール名を指定する。
起動操作
PM [オプション] 実行モジュール名 [実行させるプログラムへ渡すパラメーター] 例) PM IEFBR14 PARM-STRING は次のJCLと同じである。 // EXEC PGM=IEFBR14,PARM='PARM-STRING' PM -LK IEFBR14 AAA,A=(A,B) HDGD 'HSJDHK' は次のJCLと同じである。 // EXEC PGM=IEFBR14,PARM=('AAA,A=(A,B) HDGD ''HSJDHK''')
指定された実行モジュールは、TPMLLIB DD文で定義したライブラリー → ISPLLIB DD文で定義したライブラリー → STEPLLIB DD文で定義したライブラリー、の順に探索される。
ISPFおよびLOGONプロシージャのSTEPLIBに定義されていないデータセットに入っているモジュールを実行する場合は、ALLOCATEコマンドで、事前にTPMLLIB DD文をアロケーションしておくこと。TPMLLIBの使用はオプションであるが、アロケートされていれば実行するプログラムのタスクライブラリーとなる。
ALLOC DD(TPMLLIB) DA('dsname') SHR
PMを実行する都度、診断ログのSYSOUTがログオン中のTSOユーザー空間に割り振られて(DD名:SYSnnnnn)出力される。このログには、実行プログラムがどのライブラリーからローディングされたか、終了時の完了コード、実行に要した時間やCPU時間などが表示される。
- -Lx
オプション・パラメーター
診断ログのSYSOUTクラスを指定する。(xが割り当てたいSYSOUTクラス)
APIサービス
SVC 200
将来のための予約SVC。
SVC 201
実行するプログラムをSUPモードに切り替える。
APF許可や特権モードを必要とするマクロを使用するような場合に利用できる。プログラム・モジュールをAPF許可ライブラリーに入れておく必要はない。元のPPモードへ戻すにはMODESETマクロを使えばよい。
SVC 202
プログラムの実行をブレークして、ブレークモニター・パネルを表示する。
SVC 203
将来のための予約SVC。
ブレーク・パネルの表示(BM:Break Monitor panel)
PMツールで実行中のプログラムがSVC 202命令を出すかABENDすると、画面がブレーク・パネルに切り替わる。


画面2行目左側にブレークした理由がメッセージ表示される。>>>TSO PROGRAM MONITOR<<であれば、SVC 202命令によるブレーク、>>> PROGRAM ABENDED <<<であれば、プログラムのABENDを示す。表示されているPSWと汎用レジスターの内容はプログラム・ブレーク時もしくはABEND時のものとなる。ABEND時のPSWと汎用レジスターの内容は、SDWAEC1とSDWAGRSV(AT TIME OF ERROR)から持ってきている。ABENDの場合、このパネルはPMによるプログラムABEND処理の過程で表示され、この時点ではプログラムの実行タスクはまだ存在している。
PSWと汎用レジスターに続いて、プログラム実行空間のメモリー内容が表示される。初期表示アドレスは、ブレークもしくはABEND時のPSWが示すアドレスとなる。
ブレーク・パネルでは、SV(Storage Viewer)の機能を使って、ブレークしているプログラムのレジスターやメモリー内容を表示することでインタラクティブ・デバッグができる。CMDフィールドにGOもしくはENDコマンド(PF3キー)を入力することでプログラムの実行を再開できる(SVC 202命令の次の命令から実行が再開される)。ABENDしている場合は、PMによるABEND処理が再開されプログラムはABENDコードで終了する。
アドレス空間内メモリーの表示(ブレーク・パネルの操作、SV:Storage Viewer Operation)
SV(Storage Viewer)は、TSO/ISPF配下で実行される仮想記憶域の表示・変更プログラムである。PMはブレーク・パネルの表示に内蔵されたSVプログラムを呼び出して、仮想空間内のメモリー内容を編集してパネルに表示する。
コマンド(CMD==>フィールドに入力)
空エンター
コマンド行での空エンターは、カレントアドレスを再読込して表示する。(表示内容のリフレッシュ)
カーソルを、ストレージアドレスやデータ上に置いて、ENTERキーを押下した場合、そのアドレス、あるいはデータに対応するアドレスが、カレントアドレスになり、パネルの先頭に表示される。
address
表示したい仮想記憶域のアドレスを16進数で指定する。アドレスは16進数アドレスもしくは間接アドレス表記で指定できる。
間接アドレス表記
アドレスの指定には、16進数によるアドレス表記の他に、間接アドレス表記が使用できる。(OSのSLIPコマンド、TSOのTESTコマンドに準拠)
また、ブレークパネルでは間接アドレス表記にレジスター番号が追加で使用できる。
[address][.][+|-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ビットアドレス)
nR%|?[+|-displacement][%|?]
16進数表記のaddressの代わりに、nRの形式で、アドレス値が格納されたレジスター番号を指定することもできる。nは0〜15のレジスター番号である。GPR1に格納された値をアドレスとする場合は、1R、GPR12に格納された値をアドレスとする場合は、12R、と指定する。12R+18? とすれば、GPR12に格納された値に、x18を加えたアドレスの領域に格納されている、フルワードの内容が読み込まれ、31ビットのアドレス値となる。
例1)12R% ⇒ GPR12に格納された値が示す領域の下位3バイトの値が読み込まれ、その値が開始アドレスになる。GPR12が示すアドレスを表示するのではなく、そのアドレスは、別のアドレスが格納されたポインター領域と見なされ、そこに格納された値が開始アドレスとなる。GPR12にx00001000が格納されている場合、x1000番地にxA60038F0が格納されていれば、x0038F0がアドレス値となる。
例2)7R+10? ⇒ GPR7が示すアドレス+x10番地から始まる4バイトの領域の値が読み込まれ、その値が開始アドレスになる。(31ビットアドレス)
変位またはアドレスポインターを指定する場合、addressは省略可能で、その場合、カレントアドレスが暗黙のaddress値になる。+10 はカレントアドレスにx10を加えたアドレスになる。
PF8(DOWN.)
ストレージ・データのフォワード・スクロールを行う。
カーソルを、ストレージアドレスやデータ上に置いて、PF8キーを押下した場合、そのアドレス、あるいはデータに対応するアドレスが、カレントアドレスになり、パネルの先頭に表示される。(空エンターと同じ)
※カーソルがパネル内のストレージ・データの先頭にある時にPF8キーを押下してもスクロールはされないことに注意。
PF7(UP.)
ストレージ・データのバックワード・スクロールを行う。
カーソルを、ストレージアドレスやデータ上に置いて、PF7キーを押下した場合、そのアドレス、あるいはデータに対応するアドレスが、パネルの最終バイトに位置付くようにスクロールされる。
※カーソルがパネル内のストレージ・データの最後にある時にPF7キーを押下してもスクロールはされないことに注意。
PF5(RFIND.)
文字列またはデータの再検索を行う。
BASE address|*
BASEアドレスを設定する。BASEアドレスが設定された状態を「ベースモード」と呼ぶ。ベースモードでは、パネル上のアドレス表記が、番地から基底アドレス+変位に切り替える。* はカレントアドレスを、基底アドレスに設定することを示す。ベースモードを解除するには、BASE 0 を指定すればよい。
ベースモードでは、addressの入力は、仮想アドレスそのものではなく、BASEアドレスからの変位として扱われる。ベースモードでアドレス100を入力した場合、100番地ではなく、設定済みBASEアドレス+100番地となる。
F|FB 探索文字列
ストレージ上の文字列を探索する。FBコマンドは、バイナリーデータの探索を行う。この場合、パラメーターは16進数で指定する。
N [ote] 名前
カレントアドレスに名前を付ける。名前を付けておけば、後でPOINTコマンドによって、名前で再表示させることができる。
P [oint] [名前]
NOTEコマンドによって付けられた名前に対応する、ストレージ・データを再表示する。
名前を省略すると、NOTEパネルが表示され、パネル上で再表示箇所を選択することができる。
パネル上の名前フィールドを、空白入力またはErase EOFキーでクリアーすることで、登録済みの名前を削除することができる。
S{1|2|3|4}
カレントアドレスのストレージ・データ(1ワード:4バイト)を記憶する。記憶するための内部レジスターは4つあり、S1、S2、S3、S4で選択する。
B{1|2|3|4}
カレントアドレスのストレージ・データ(1ワード:4バイト)を記憶して、BREAK SVC命令を埋め込む。Bnのnには、1〜4の内部レジスター番号を指定する。
※SnとBnは同じ内部レジスターを使用しているので、nが同じ番号であれば上書きされる。S1コマンドで記憶した後、R1コマンドでリストアーすることなくB1コマンドを使うとS1コマンドで記憶されたアドレスと内容は上書きされてしまう。
R{1|2|3|4}
記憶済みのストレージ・データをリストアする。
AM [newdata]
カレントアドレスのストレージ・データを書き換える。書き込むデータは16進数で指定する。書き込みアドレスの指定はできない。書き込みアドレスを変更したければ、先にそのアドレスを先頭に表示させ、カレントアドレスを変更しておくこと。
SHOW mnemonic
OSのコントロール・ブロックを表示する。表示したいコントロール・ブロックのニーモニックをパラメーターに指定する。SHOW CVT、SHOW JPQ、など。
SHOW JPQはPF6にも割り当ててある。
- CVT
- ECVT
- ASVT
- SSCT
- SVCTABLE
- LPQ
- LPQ,D
- JPQ
- ASCB
- TCB
- RB
- MAINEP
- PSW
- SDWA
CVTを表示する。
ECVTを表示する。
ASVTを表示する。
1st SSCTエントリーを表示する。
SVCTABLEを表示する。
LINK PACK QUEUE(PLPA)を表示する。
Dynamic LPA QUEUE(MLPA)を表示する。
JOB PACK QUEUEを表示する。
ASCBを表示する。
TCB(Current TASK)を表示する。
カレント・タスクとはブレークしたプログラムのタスクであるが、ABEND時はPMのコントロール・タスクとなる。ABENDしたプログラムのタスクはこのタスクのサブ・タスクとなる。
RB(Current RB)を表示する。
Current TASKのメインプログラムを表示する。
PSWが指すアドレス領域を表示する。
SDWAのコピーを表示する。(PM配下のプログラムがABENDした場合のみ)
MAIN
カレント・タスクのメインプログラムの入口点を表示する。
MDLA
カレント・タスクのメインプログラムの先頭アドレス(ローディングアドレス)を表示する。
PF10(RETRIEVE)
コマンド・ヒストリーを行う。(ISPFの機能)
PF1(HELP)
ヘルプ・パネルを表示する。
PMに内蔵されたSVはブレーク・パネル表示用のサブセット版なので、ヘルプに記載されている機能やコマンドの全てが使用できるわけではない。表示するアドレス空間の切替や、ブレーク・モニターの制御に関するコマンドや機能は利用できない。