[ 前のページ ]
[ 次のページ ]
[ 目次 ]
[ 索引 ]
[ DOC Home ]
本章では,デバッガの機能のうちマルチプロセス・プログラム(2つ以上のプロセスで動作するプログラム) 独自のものについて説明します。これらの機能を使用して, プロセス情報を表示したり,特定のプロセスの実行を制御することができます。 他章で説明した機能と併せて使用してください。
最初の節では,マルチプロセス・プログラムの2つのマルチプロセス・モデルについて説明します。 残りの各節では,基本的なマルチプロセス・デバッグ方法やマルチプロセス・ コマンドなどについて詳しく説明します。
本章で扱うすべてのイメージはデバッグ可能であり,デバッガの制御下に置くことができます。 デバッグ可能なイメージとは,/NOTRACEBACK修飾子を使用しないでリンクしたイメージのことです。 第1.2節で説明したように, イメージのデバッグ時にすべてのシンボル情報にアクセスできるのは, そのモジュールを/DEBUG修飾子を使用してコンパイルおよびリンクしたときだけです。
OpenVMS Alphaシステムの場合,デバッガは,変換されたイメージのデバッグをサポートしてしません。 変換されたイメージをデバッグする必要があるときは,Delta/XDelta デバッガを使用してください。このデバッガの詳細については, 『OpenVMS Delta/XDelta Debugger Manual』を参照してください。
マルチプロセス・プログラムは,次の2つのマルチプロセス・モデルのいずれかに従っています。
マルチプロセス・プログラムがプログラミング処理のためにプロセスを作成し, 各プロセスとの接続を開始します。
ユーザつまりクライアントが,クライアントの要求を処理するサーバとの接続を開始します。 サーバは,プログラミング処理のためにスレッドを作成します。
デバッガのマルチプロセス機能とコマンドは,両方のマルチプロセス・モデルをサポートしていますが, プロセスの関係はデバッガの起動によって異なります。
本節では,マルチプロセス・デバッグ環境の概要と,マルチプロセス・プログラムのデバッグに使用される基本的な方法について説明します。 これ以外の詳細については, 次節以降を参照してください。
本項では,マルチプロセス・デバッグ・セッションを開始する通常の方法について説明します。 イメージの実行を中断してそのイメージをデバッガの制御下に置くことによってデバッガを起動する別の方法, たとえば, Ctrl/Y-DEBUGシーケンスやCONNECTコマンドを使う方法についての詳しい説明は, 第15.3.4項を参照してください。
マルチプロセス・デバッグ・セッションを開始するには,次のようにします。
$ DEFINE/GROUP DBG$PROCESS MULTIPROCESS
このコマンドは,プロセスが発生した利用者識別コード(UIC)グループのマルチプロセス・ デバッグ構成を設定する。その結果,同一のUICグループに関連づけられているデバッグ可能なイメージは,1 セッションから制御できるようになる。
すべてのプロセスがデバッガの同じバージョンを使用していなければならない。 論理名を使用してデバッガ・イメージの起動を制御する場合には, すべてのプロセスが同じ論理名定義を使用するようにしなければならない。
$ DEBUG/KEEP Debugger Banner and Version Number DBG> RUN prog-name Language: FORTRAN, Module: MAIN_PROG Type GO to reach main program predefined trace on activation at routine MAIN_PROG in %PROCESS_NUMBER 1 DBG_1> DBG>
単一プロセス・プログラムの場合と同様,デバッガはバナーを表示し,コマンド入力を要求してきます。 そして,メイン・イメージの開始直前で実行を中断します。 ただし,次の2点に注意してください。
プロンプト接尾辞(_1)の意味については,第15.2.2 項で説明します。
マルチプロセス構成では,デバッガは,新しくデバッガの制御下に置かれたプロセスをトレースします。 この例では,デバッガは,プログラムのメイン・ イメージを実行する最初のプロセスをトレースします。%PROCESS_ NUMBERは,%LINEが行番号を示すのと同様,プロセス番号を示す組み込みシンボルです。
デバッグ構成とプロセスの関係についての詳しい説明は,第15.3.1項を参照してください。 また,マルチプロセス・ デバッグに関するシステムの必要条件については,第15.3.9項を参照してください。
前項の例は,マルチプロセス・デバッグ構成のデバッガ・プロンプトは, プログラムがデバッガの制御下に置かれたあとの省略時の構成のプロンプトとは異なることを示しています。
マルチプロセス構成では,動的プロンプト設定(SET PROMPT /SUFFIX=PROCESS_NUMBER)が省略時の設定として使用可能になっています。 したがって,プロンプトには可視プロセスのプロセス番号を示すプロセス固有の接尾辞が付いています。 デバッガは,特定のデバッグ・ セッションの制御下に置かれた各プロセスに対して,プロセス1 から順にプロセス番号を割り当てます。
可視プロセスとは,プロセス固有コマンドを実行する省略時のコンテキストのことです。 プロセス固有コマンドは,実行開始(STEP,GOなど),シンボル検索, ブレークポイントの設定,呼び出しスタックおよびレジスタの確認などを行います。 プロセスに固有でないコマンドは,メモリへのマッピングには依存しませんが, デバッグ環境全体に影響を与えます(たとえば, キーパッド・モードや画面モードのコマンド)。
動的プロンプト設定が使用不能(SET PROMPT/NOSUFFIX)に設定されていないかぎり, デバッガ・プロンプト接尾辞は常に,可視プロセスを示します( たとえば,DBG_1>)。SET PROMPTコマンドには,プロンプト文字列の接頭辞および接尾辞をユーザの要望に合わせるためのオプションがいくつかあります。
現在のデバッグ・セッションの制御下にあるプロセス情報を取得するには,SHOW PROCESS コマンドを使用します。省略時の設定では,SHOW PROCESSコマンドは,可視プロセスの情報1行だけを表示します。次に示すのは, デバッガ起動直後に表示される情報の1例です。
DBG_1> SHOW PROCESS Number Name Hold State Current PC * 1 JONES activated MAIN_PROG\%LINE 2 DBG_1>
SHOW PROCESSコマンドの1行表示は,各プロセスについて次の情報を提供します。
状態 | 説明 |
---|---|
Activated | イメージとそのプロセスがデバッガの制御下に置かれた直後。 |
Break[1] | ブレークポイントが検出された。 |
Interrupted | 他プロセスで実行が中断されたか, またはユーザが強制終了キー・シーケンス(省略時の設定ではCtrl/C)の入力によって実行に割り込みをかけたため, プロセスの実行が中断された。 |
Step[1] | STEPコマンドが終了した。 |
Terminated | イメージの実行は終了したが,プロセスはまだデバッガの制御下に置かれている。 したがって,ユーザは,イメージとそのプロセスに関する情報を得ることができる。 |
Trace[1] | トレースポイントが検出された。 |
Unhandled exception | 未処理例外が発生した。 |
Watch of | ウォッチポイントが検出された。 |
[1]上記以外のデバッグ状態については,SHOW PROCESSコマンドの説明を参照してください。 |
SHOW PROCESS/ALLコマンドは,現在デバッガの制御下にあるすべてのプロセスに関する情報を提供します。 前の例では,プロセス1だけを表示します。SHOW PROCESS/FULL コマンドを使用して,プロセスに関する詳細な情報が得られます。
前の例で,SHOW PROCESSコマンドの後ろにSTEPコマンドを入力すると, SHOW PROCESS表示の状態欄は,ステップ実行完了後,実行が停止していることを示します。
DBG_1> SHOW PROCESS Number Name Hold State Current PC * 1 JONES step MAIN_PROG\%LINE 3 DBG_1>
同様に,ブレークポイントを設定してGOコマンドを入力し,ブレークポイントが検出されたあとのプロンプトでSHOW PROCESS コマンドを入力すると, 状態はbreakを示します。
前項の例を使用して説明を続けます。さらにSTEPコマンドを2,3個入力し, ステップ実行の途中で,MAIN_PROGがTESTと呼ばれるデバッグ可能なイメージを実行するプロセスを作成したとします。
DBG$PROCESSの値はMULTIPROCESSに設定されているので,作成されたプロセスは, 現在のデバッグ・セッションへの接続を要求し,イメージTESTは実行開始直前で停止状態となります。
作成されたプロセスが接続を待っている間は,デバッガはそのプロセスを認識することはなく,SHOW PROCESS/ALL コマンドの表示にも現れません。 このプロセスをデバッガの制御下に置くには,次のいずれかの方法を使用します。
次に,CONNECTコマンドの使用例を示します。
DBG_1> STEP stepped to MAIN_PROG\%LINE 18 in %PROCESS_NUMBER 1 18: LIB$SPAWN("RUN/DEBUG TEST",,,1) DBG_1> STEP stepped to MAIN_PROG\%LINE 21 in %PROCESS_NUMBER 1 21: X = 7 DBG_1> CONNECT predefined trace on activation at routine TEST in %PROCESS_NUMBER 2 DBG_1>
この例では,2番目のSTEPコマンドによって,プロセスを作成するLIB$SPAWN 呼び出しが実行されます。そして,CONNECTコマンドによって接続待ち状態のプロセスがデバッガの制御下に置かれます。 CONNECTコマンド実行後は,プロセスが接続されるまで少し時間がかかります。"predefined trace on . . . " のメッセージは,第15.2.1項で説明するように, デバッガが新しいプロセスを制御下に置き, そのプロセスをプロセス2,すなわち, このセッション内でデバッガが2番目に認識したプロセスとして示します。
ここで,SHOW PROCESS/ALLコマンドを入力すると,各プロセスのデバッグ状態と実行が停止している記憶位置を表示できます。
DBG_1> SHOW PROCESS/ALL Number Name Hold State Current PC * 1 JONES step MAIN_PROG\%LINE 21 2 JONES_1 activated TEST\%LINE 1+2 DBG_1>
CONNECTコマンドは,デバッガへの接続待ち状態にあるすべてのプロセスを, デバッガの制御下に置くことに注意してください。接続待ちのプロセスが存在しない場合は,Ctrl/C を押してCONNECTコマンドを強制終了し, デバッガ・プロンプトを表示します。
システムで実行中のデバッガのバージョンによっては,ユーザが作成したプロセスとの接続だけに制限される場合もあります。 詳細については,オンラインヘルプのCONNECT コマンドの説明を参照してください。
デバッガの論理名(DEBUG,DEBUGSHR,DEBUGUISHR,DBGTBKMSG, DBG$PROCESS,DBG$HELP,DBG$UIHELP,DEBUGAPPCLASS,VMSDEBUGUIL) がデバッガと対象プロセスの両方で同一の定義に変換されていることを確認してからでないと,CONNECT コマンドの入力によって予期せぬ結果になることがあります。
省略時の設定では,プロセス固有コマンドは可視プロセスのコンテキスト内で実行されます。DO コマンドを使用して,現在デバッガの制御下にある1 つまたは複数のプロセスのコンテキスト内でコマンドを実行できます。 これをコマンドをプロセスにブロードキャストするといいます。
すべてのプロセスのコンテキスト内でコマンドを実行するには,修飾子無しのDO コマンドを使用します。たとえば,次のコマンドは,現在デバッガの制御下にあるすべてのプロセス( この例では,プロセス1とプロセス2)に対してSHOW CALLS コマンドを実行します。
DBG_1> DO (SHOW CALLS) For %PROCESS_NUMBER 1 module name routine name line rel PC abs PC *MAIN_PROG MAIN_PROG 21 0000001E 0000041E For %PROCESS_NUMBER 2 module name routine name line rel PC abs PC TEST TEST 1+2 0000000B 0000040B
この例でわかるように,デバッガは,デバッガの出力ごとにプロセスを示します。
特定のプロセスのコンテキスト内でコマンドを実行するには,DOコマンドに/PROCESS= 修飾子を指定します。たとえば,次のコマンドは,SET MODULE STARTおよびEXAMINE Xコマンドをプロセス2のコンテキスト内で実行します。
DBG_1> DO/PROCESS=(%PROC 2) (SET MODULE START; EXAMINE X)
デバッガ・コマンド内でのプロセスの指定方法についての詳しい説明は, 第15.3.2項を参照してください。
マルチプロセス・デバッグ環境でのプログラム実行は,次の規則に従います。
これらの概念について,CONNECTコマンドの使用方法を示した第15.2.4項の例を使用して説明します。
その例では,"stepped to . . . "のメッセージによって,2つのコマンドがプロセス1 ,すなわち可視プロセスのコンテキスト内で実行されたことを示しています。2 番目のSTEPコマンドがプロセス2を作成します。第15.2.4項の例のSHOW PROCESS/ALL コマンドは, プロセス1とプロセス2での実行が,それぞれMAIN_PROG\%LINE 21とTEST\%LINE 1+2 で停止していることを示しています。
この時点で,SHOW PROCESS/ALLに続いて,さらにSTEPコマンドを入力すると, 次のような結果になります。
DBG_1> STEP stepped to MAIN_PROG\%LINE 23 in %PROCESS_NUMBER 1 23: Y = 15 DBG_1> SHOW PROCESS/ALL Number Name Hold State Current PC * 1 JONES step MAIN_PROG\%LINE 23 2 JONES_1 interrupted TEST\%LINE 3+1 DBG_1>
プロセス1,すなわち可視プロセスのコンテキスト内でSTEPコマンドが実行されます。STEP コマンドが終了すると,プロセス1の実行はMAIN_ PROG\%LINE 23で停止します。しかし,このSTEPコマンドは同時に,プロセス2 の実行も開始します。プロセス1でのSTEPコマンドの終了によって, プロセス2の実行はTEST\%LINE 3+1で中断しています。
第15.2.6.1項では,SET MODE NOINTERRUPTコマンドによって設定される,もう1つの実行モードについて説明します。
SET MODE NOINTERRUPTコマンドを使用すれば,あるプロセス内で実行が中断しても, それ以外のプロセスで割り込みを発生させることなく継続させることができます。 この機能は,たとえば,DOコマンドを使用していくつかのプロセスにSTEP コマンドをブロードキャストし,それらすべてのプロセス内でSTEP コマンドを割り込みを発生させることなく終了させたい場合に特に有効です。 次に例を示します。
DBG_1> SET MODE NOINTERRUPT DBG_1> DO (STEP)
この例では,DOコマンドがすべてのプロセスのコンテキスト内でSTEPコマンドを実行します。 可視プロセスおよび凍結状態でない他のすべてのプロセスが実行を開始します。SET MODE NOINTERRUPT コマンドが入力されているため, 動作中のすべてのプロセス内でSTEPコマンドの実行の終了後に初めて, またはブレークポイントまたはウォッチポイントで実行が停止したあとに, プロンプトが表示されます。
SET MODE NOINTERRUPTが有効である間は,いずれかのプロセス内で実行が継続しているかぎり, デバッガは入力プロンプトを表示しません。このような場合に, すべてのプロセスに割り込みをかけてプロンプトを表示するには,Ctrl/C を使用します。
前項で説明したように,実行開始コマンドは可視プロセスのコンテキスト内で実行されますが, 同時にそれ以外のプロセスでも実行を開始させます。 あるプロセスでの実行を禁止したい場合には,そのプロセスを凍結します。 たとえば,次のSET PROCESS/HOLDコマンドはプロセス2を凍結します。 その後のSTEPコマンドはプロセス1,すなわち可視プロセスのコンテキスト内で実行されます。 凍結状態でない他の任意のプロセス内でも実行が開始されますが, プロセス2では実行が凍結されます。
DBG_1> SET PROCESS/HOLD %PROC 2 DBG_1> STEP
SHOW PROCESSコマンド表示は,プロセスが凍結状態にあるかどうかを示します。 次に例を示します。
DBG_1> SHOW PROCESS/ALL Number Name Hold State Current PC * 1 JONES step MAIN_PROG\%LINE 24 2 JONES_1 HOLD interrupted TEST\%LINE 3+1 DBG_1>
凍結状態からプロセスを解放するには,SET PROCESS/NOHOLDコマンドを入力して解放したいプロセスを指定します。
可視プロセスでは,凍結状態が無視されることに注意してください。したがって,SET PROCESS/HOLD/ALL コマンドは,可視プロセスだけに実行を制限する便利な方法です。 次の例では,可視プロセス内でのみ実行が開始されます。
DBG_1> SET PROCESS/HOLD/ALL DBG_1> STEP
この機能は,たとえば,CALLコマンドを使用して,ユーザ・プログラムの実行ストリームには含まれないダンプ・ ルーチンを実行する場合などに有効です。
またこれは,DOコマンドを使用してGO,STEP,CALLの各コマンドをいくつかのプロセスにブロードキャストする場合にも当てはまります。GO , STEP,またはC ALLの各コマンドは,指定された各プロセスのうち凍結されていないプロセスのコンテキスト内で実行され, 凍結されていないその他のプロセスでの実行を開始します。 次の例は,すべてのプロセスが凍結状態にあるときに, すべてのプロセスにコマンドがブロードキャストされた場合の実行動作を示しています。 実行は,可視プロセス(この場合はプロセス1) でのみ開始されます。
DBG_1> SET PROCESS/HOLD/ALL DBG_1> DO (EXAMINE X; STEP) For %PROCESS_NUMBER 1 MAIN_PROG\X: 78 For %PROCESS_NUMBER 2 TEST\X: 29 stepped to MAIN_PROG\%LINE 26 in %PROCESS_NUMBER 1 26: K = K + 1 DBG_1>
別のプロセスを可視プロセスとして設定するには,SET PROCESSコマンドを省略時の/VISIBLE 修飾子とともに使用します。たとえば,次のコマンドは, プロセス2を可視プロセスにします。
DBG_1> SET PROCESS %PROC 2 DBG_2>
この例では,省略時の設定として動的プロンプト設定が使用可能になっているため,SET PROCESS コマンドによって,プロンプト文字列の接尾辞も変わります。 プロンプトは,プロセス2が可視プロセスであることを示しています。 これで,すべてのプロセス固有コマンドは,プロセス2のコンテキスト内で実行されるようになります。 たとえば,SHOW CALLSコマンドを実行すると, プロセス2内で動作しているイメージの呼び出しスタックが表示されます。
省略時の設定では,動的プロセス設定が使用可能(SET PROCESS/DYNAMIC) になっています。その結果,デバッガがプログラムの実行を中断してプロンプトを表示するときは必ず, 実行が中断されたプロセスが自動的に可視プロセスになります。 動的プロセス設定は,次のような場合に起こります。 すなわち,ブレークポイントまたはウォッチポイントが検出されたとき, 例外条件が発生したとき,STEPコマンドが終了したとき,または最後のプロセスがイメージ終了命令を実行したときです。
動的プロセス設定が使用不能(/NODYNAMIC)のときには,SET PROCESS /VISIBLEコマンドによって別のプロセスが指定されるまで,可視プロセスは変更されません。
次に,動的プロセス設定の例を,動的プロンプト設定の例とともに示します。
DBG_1> SHOW PROCESS/ALL Number Name Hold State Current PC * 1 JONES step MAIN_PROG\%LINE 22 2 JONES_1 interrupted TEST\%LINE 4 DBG_1> DO/PROCESS=(%PROC 2) (SET BREAK %LINE 11) DBG_1> GO . . . break at TEST\%LINE 11 in %PROCESS_NUMBER 2 DBG_2> SHOW PROCESS/ALL Number Name Hold State Current PC 1 JONES interrupted MAIN_PROG\%LINE 28 * 2 JONES_1 break TEST\%LINE 11 DBG_2>
この例では,プロンプトとSHOW PROCESSの出力が示すとおり,最初はプロセス1 が可視プロセスになっています。DOコマンドによって,プロセス2のコンテキスト内にブレークポイントが設定されます。GO コマンドによって実行が再開され, プロセス2のブレークポイントで実行が中断します。この時点で, プロンプトとSHOW PROCESSの表示が示すとおり,プロセス2が可視プロセスとなっています。
SET MODE NOINTERRUPTコマンドを入力し,DOコマンドを使用していくつかのプロセス内で実行を開始すると, すべてのプロセス内での実行の停止後に初めて, プロンプトが表示されます。この場合,最後のプロセスがイメージ終了命令を実行して可視プロセスにならないかぎり, 可視プロセスは変更されません。
プロセスのメイン・イメージの実行が終了すると,プロセスはデバッグ終了状態になります。 オペレーティング・システムでのプロセスの終了と混同しないよう注意してください。 この状態は,省略時の設定によって, SET TRACE/TERMINATINGコマンドが入力された場合と同じようにトレースされます。
プロセスがデバッグ終了状態にあるときは,デバッガは,まだそのプロセスを認識しており,SHOW PROCESS/ALL コマンドの実行で表示されます。したがって, コマンドを入力して,変数の検査などを行えます。
プログラムの最後のイメージが終了すると,デバッガは制御を取得し,プロンプトを表示します。
プロセスを終了せずにそのプロセスをデバッガの制御から解放するには, DISCONNECTコマンドを入力します。一方,プロセスにEXITまたはQUITコマンドを指定すると, そのプロセスは終了します。
DISCONNECTコマンドは,クライアント/サーバ・モデルのプログラムには必須です。 たとえば,次のコマンドはJONESイメージを切断します。
DBG> DISCONNECT JONES DBG>
DICONNECTコマンドの制約と注意事項に関しては,第15.3.5項を参照してください。
デバッグ・セッションを終了することなく,指定したプロセスだけを終了するには,EXIT またはQUITコマンドのパラメータとして1つまたは複数のプロセスを指定します。 たとえば,次のコマンドは,プロセス2で動作しているイメージを終了し, プロセスを終了します。
DBG_3> EXIT %PROC 2 DBG_3>
このあと,プロセス2は,SHOW PROCESSコマンドの実行では表示されません。EXIT コマンドおよびQUITコマンドの説明を参照してください。
Ctrl/C,またはSET ABORT_KEYコマンドによって設定された強制終了キー・ シーケンスを押すことによって,現在イメージを実行しているすべてのプロセス内で, 実行に割り込みをかけることができます。これは,SHOW PROCESSの表示では,Interrupted状態として示されます。
省略時の構成と同様,Ctrl/Cを使用してデバッガ・コマンドを強制終了させることもできます。
すべてのデバッグ・セッションを終了するには,何もパラメータを指定しないでEXIT コマンドまたはQUITコマンドを入力します。
EXITコマンドは,プログラム内で宣言されている任意の終了ハンドラを実行します。QUIT コマンドは,終了ハンドラを実行しません。
したがって,何もパラメータを指定しない場合は,EXITコマンドとQUITコマンドの動作は, 省略時のデバッグ構成の動作と同じです。
この節では,第15.2節の内容よりもさらに高度な概念および使用法などの詳細な情報について説明します。
ユーザは,デバッガを省略時の構成またはマルチプロセス構成のいずれかの設定で起動することによって, それぞれ1つまたは複数のプロセスで動作するプログラムをデバッグすることができます。
デバッグ構成は,次の表に示すように,論理名DBG$PROCESSの現在の定義によって異なります。
論理名DBG$PROCESSの定義 | デバッグ構成 |
---|---|
未定義またはDEFAULT | 省略時の設定。1 プロセス内で動作するプログラムの構成として使用する。 |
MULTIPROCESS | マルチプロセス。 いくつかのプロセス内で動作するプログラムの構成として使用する。 |
デバッグ構成は,プログラムが1つまたは複数のプロセス内で動作するかどうかによって決まるのではないことに注意してください。DBG$PROCESS の現在の定義によって決まるのは,異なるプロセスで動作するデバッグ可能なイメージが同じデバッグ・ セッションから制御できるかどうかです。
デバッガを起動する前に,DCLコマンドSHOW LOGICAL DBG$PROCESSを入力して, 現在のDBG$PROCESSの定義とそれに対応するデバッグ構成を確認してください。
1つのプロセス内だけで,デバッガを使用せずに動作するプログラムをデバッグするには, 省略時の構成を使用します。この構成が設定されるのは,DBG$PROCESS が未定義か,またはDEFAULTに定義されているときです。
次の例では,SHOW LOGICALコマンドの出力によって,省略時の構成が有効であることが分かります。
$ SHOW LOGICAL DBG$PROCESS %SHOW-S-NOTRAN, no translation for logical name DBG$PROCESS
DBG$PROCESSの値はMULTIPROCESSに定義されていますが,1プロセス内だけで動作するプログラムをデバッグしたい場合には, 次のコマンドを入力します。
$ DEFINE DBG$PROCESS DEFAULT
通常,2つ以上のプロセスで動作するプログラムをデバッグするには, マルチプロセス構成を使用します。この構成は,DBG$PROCESSの値がMULTIPROCESS に定義されているときに設定され,いくつかのプロセスと会話できるようになります。 マルチプロセス・デバッグ構成を設定するには, 次のコマンドを使用します。
$ DEFINE/GROUP DBG$PROCESS MULTIPROCESS
デバッガは,コードの大部分を含むメイン・デバッガ・イメージ(DEBUGSHR.EXE) と,より小さなカーネル・デバッガ・イメージ(DEBUG.EXE) の2つの部分からなります。このように分割されているため, デバッガとデバッグされるプログラムが干渉し合う可能性が少なくなり, マルチプロセス・デバッグ構成も可能となります。
ユーザがデバッガを起動すると,プロセスが作成され,メイン・デバッガが実行されます。 省略時構成かマルチプロセス構成かに関係なく,あるプロセス内で動作するメイン・ デバッガが存在することによって,一意のデバッグ・ セッションが設定されます。
プログラムがデバッガの制御下に置かれると,メイン・デバッガはサブプロセスを作成して, プログラムとカーネル・デバッガを並行に動作させます。
マルチプロセス構成では,デバッグされるプログラムはいくつかのプロセス内で動作します。 デバッガの制御下で1つまたは複数のイメージを実行している各プロセスは, カーネル・デバッガのローカル・コピーも実行しています。 自身のプロセス内で動作しているメイン・デバッガは,カーネル・ デバッガを通して他のプロセスと通信します。
マルチプロセス構成のすべてのプロセスは,同じUICグループ内に存在しなければなりませんが, 特定のプロセス/サブプロセス関係の中で関連づけられる必要はありません。 また,異なるプロセス内で動作するプログラム・ イメージが,お互いに通信する必要はありません。
マルチプロセス・デバッグに関するシステム要件については,第15.3.9項を参照してください。
デバッガ・コマンド内でプロセスを指定する場合は,CONNECTコマンドを使用したプロセス指定を除けば, 表 15-2に示した形式のどれでも使用できます。 第15.3.4.2項を参照してください。
CONNECTコマンドは,デバッガがまだ認識していないプロセスをデバッガの制御下に置くために使用します。 したがって,CONNECTコマンドにプロセスを指定するには, プロセス名またはプロセス識別子(PID)のいずれかしか使用できません。 デバッガが割り当てたプロセス番号や,そのプロセスのプロセス組み込みシンボル( たとえば%NEXT_PROCESS)は使用できません。
形式 | 使用方法 |
---|---|
[%PROCESS_NAME] process-name | スペースや小文字を含まないプロセス名 [1]。 |
[%PROCESS_NAME] "process-name" | スペースまたは小文字を含むプロセス名。 二重引用符(")の代わりに, 一重引用符を(')使用することもできる。 |
%PROCESS_PID process_id | プロセス識別子(PID ,16進数)。 |
%PROCESS_NUMBER
process-number
(or %PROC process-number) | デバッガの制御下に入ったときにプロセスに割り当てられた番号。 新しい番号は, 1から順番に各プロセスに割り当てられる。EXITコマンドまたはQUITコマンドによってプロセスが終了しても, そのデバッグ・セッション中はその番号は再利用されない。 プロセス番号はSHOW PROCESSコマンドの実行で表示される。 プロセスは,組み込みシンボル%PREVIOUS_PROCESS および%NEXT_PROCESSによってインデックスづけできるように,循環リスト内に順序づけされる。 |
process- group-name | DEFINE/PROCESS_GROUPコマンドで定義された, プロセスのグループを表すシンボル。 |
%NEXT_PROCESS | デバッガの循環プロセス・ リスト中で可視プロセスの次のプロセス。 |
%PREVIOUS_PROCESS | デバッガの循環プロセス・ リスト中で可視プロセスの前のプロセス。 |
%VISIBLE_PROCESS | シンボル,レジスタ値,ルーチン呼び出し, ブレークポイントなどの検索時に現在のコンテキストになっているスタック, レジスタ・セット,およびイメージを持つプロセス。 |
[1]プロセス名にはワイルドカード文字(*)を含めることができます。 |
コマンド入力の際は,次のように,組み込みシンボル%PROCESS_NAMEを省略することができます。
DBG_2> SHOW PROCESS %PROC 2, JONES_3
また,プロセスのグループを表すシンボルを定義することもできます(DEFINE/PROCESS_GROUP) 。その結果,次のように,省略形式でコマンドを入力できます。
DBG_1> DEFINE/PROCESS_GROUP SERVERS=FILE_SERVER, NETWORK_SERVER DBG_1> SHOW PROCESS SERVERS Number Name Hold State Current PC * 1 FILE_SERVER step FS_PROG\%LINE 37 2 NETWORK_SERVER break NET_PROG\%LINE 24 DBG_1>
組み込みシンボルの%VISIBLE_PROCESS,%NEXT_PROCESS,および%PREVIOUS_PROCESS は,IF,WHILE,REPEATの各コマンドに基づいた制御構造内やコマンド・ プロシージャ内で利用できます。
省略時の設定では,トレースポイントは,プロセスがデバッガの制御下に置かれたとき, およびプロセスがイメージ終了命令を実行したときに検出されます。 これらの定義済みトレースポイントは,SET TRACE/ACTIVATING コマンドおよびSET TRACE/TERMINATINGコマンドをそれぞれ入力した場合と同じ結果をもたらします。SET BREAK/ACTIVATING コマンドおよびSET BREAK/TERMINATINGコマンドを使用すれば,これらのイベント発生時にブレークポイントを設定することができます。
定義済みのトレースポイントを取り消すには,CANCEL TRACE/PREDEFINED コマンドを/ACTIVATING修飾子および/TERMINATING修飾子といっしょに使用します。 ユーザ定義の起動時および終了時のブレークポイントを取り消すには,CANCEL BREAK コマンドを/ACTIVATING修飾子および/TERMINATING 修飾子といっしょに使用します。/USER修飾子は,ブレークポイントまたはトレースポイントを取り消す場合の省略時の設定です。
デバッガ・プロンプトは,最初のプロセスがデバッガの制御下に置かれたときに表示されます。 その結果,単一プロセス・プログラムの場合のように, メイン・イメージの実行が開始される前にコマンドを入力できます。
また,デバッガ・プロンプトは,最後のプロセスがイメージ終了命令を実行したときにも表示されます。 その結果,単一プロセス・プログラムの場合のように, プログラムの実行の終了後,コマンドを入力できます。
ユーザは,デバッガの制御外で動作しているあるプロセス内のデバッグ可能なイメージに割り込みをかけて, そのプロセスをデバッガに接続することができる。
省略時の構成と同様にマルチプロセス・デバッグ構成でもCtrl/Y-DEBUG シーケンスを使用します(第1.7節を参照) 。
次の例は,新しいデバッグ・セッションを開始する方法を示したものです。
$ DEFINE/GROUP DBG$PROCESS MULTIPROCESS $ RUN/NODEBUG PROG2 . . . <Ctrl/Y> Interrupt $ DEBUG Debugger Banner and Version Number Language: FORTRAN, Module: SUB4 predefined trace on activation at SUB4\%LINE 12 in %PROCESS_NUMBER 1 DBG_1>
この例では,DEFINE/JOBコマンドが,マルチプロセス・デバッグ構成を設定します。RUN/NODEBUG コマンドは,デバッガの制御外でイメージPROG2の実行を開始します。Ctrl/Y-DEBUG シーケンスによって実行に割り込みをかけ, デバッガを起動します。
デバッガのバナーは,新しいデバッグ・セッションが開始されたことを示しています。 プロセス固有プロンプト(DBG_1>)は,これがマルチプロセス構成であることを示し, 実行がイメージPROG2が動作しているプロセス1で停止しています。
起動時トレースポイントは,実行に割り込みがかかった記憶位置,およびデバッガがプロセスの制御を取得した記憶位置を示します。SHOW CALLS コマンドを使用して, その記憶位置での呼び出しスタックを表示することもできます。
デバッガが起動されると,CONNECTコマンドを使用して,他のプロセスをデバッガの制御下に置くことができます。 先の例では,CONNECTコマンドを使用して, 実行に割り込みをかける前にPROG2によって作成されたプロセスをデバッガの制御下に置くことができます( 第15.3.4.2項を参照)。
マルチプロセス・デバッグ・セッションが,割り込みがかかったイメージと同じジョブ内に存在する場合には,Ctrl/Y-DEBUG シーケンスを使用すると, イメージがセッションに接続されます。この場合,新しいセッションは開始されていないため, デバッガのバナーはデバッガが制御を取得しても表示されません。 この状況は,たとえば,セッションからSPAWN/NOWAIT コマンドを入力し,RUN/NODEBUGコマンドで実行を開始して, 最後にCtrl/Y-DEBUGシーケンスを入力することによっても発生します。
CONNECTコマンドをパラメータなしで使用する方法については,第15.2.4項を参照してください。CONNECT コマンドをパラメータ付きで使用すると,デバッガの制御外で動作しているデバッグ可能なイメージに割り込みをかけて, それを現在のデバッグ・ セッションの制御下に置くことができます。
イメージを起動するには,次のような方法があります。
次の例では,CONNECTコマンドがプロセスJONES_3内で動作しているイメージに割り込みをかけ, 現在のデバッグ・セッションの制御下に置きます。 プロセスJONES_3は,デバッグ・セッションと同じジョブ内に存在しなければなりません。
DBG_1> CONNECT JONES_3
プロセスは,デバッグ・セッションに接続されるまでは,デバッガ・プロセス番号では示されないことに注意してください。 したがって,CONNECT コマンドにプロセスを指定するときは,プロセス名またはプロセス識別子(PID) しか使用できません。
CONNECTコマンドには,デバッグ・セッションからプロセスに接続し, Ctrl/Y-DEBUGシーケンスを入力してイメージの実行に割り込みをかけ,デバッガを起動するのと同じ効果があります。 しかし,CONNECTコマンドのほうが入力しやすく, また接続できないプロセスに割り込みをかけることもできます。
CONNECTコマンドを入力して,デバッグ可能イメージを中断しプロセスをデバッガの制御下に置いた後は,DISCONNECT コマンドを入力して,そのプロセスを終了せずに解放することができます。 一方,プロセスにEXITまたはQUIT コマンドを指定すると,そのプロセスは終了します。
CTRL/Y-DEBUGシーケンスやRUN/DEBUGコマンドでデバッガを起動する場合,DISCONNECT コマンドの使用法に注意してください。次のような状況は避けてください。
さらに,デバッガ・カーネルはデバッグ中のイメージと同一のプロセスの中で稼動していることに注意してください。 このプロセスにDISCONNECTコマンドを実行すると, プロセスは解放されますが,カーネルはそのまま稼動状態です。 この稼動状態は,プログラム・イメージの実行が終了するまで続きます。 新しいバージョンのデバッガをインストールした場合,切断されているが稼動状態のいくつかのカーネルがユーザ・ プログラム領域を占めていると, デバッガのインストールと動作に関する問題が発生することがあります。
画面モード・ディスプレイは,定義済みの場合もユーザ定義の場合も, 省略時の設定によって可視プロセスと関連づけられます。たとえば,SRC は,可視プロセス内で実行が中断しているソース・コード部分を表示し, OUTは,可視プロセスのコンテキスト内で実行されたコマンドの出力を表示します。
/PROCESS修飾子をDISPLAYコマンドといっしょに使用して,それぞれプロセス固有のディスプレイを作成したり, 既存のディスプレイをプロセス固有にすることができます。 プロセス固有のディスプレイは,そのプロセスのコンテキスト内で生成および修正されます。 ユーザは,PROMPTディスプレイを除く任意のディスプレイをプロセス固有にすることができます。 たとえば, 次のコマンドは,プロセス3において,実行が中断している箇所のソース・ コードを表示する,ソース・ディスプレイSRC_3を自動的に更新します。
DBG_2> DISPLAY/PROCESS=(%PROC 3) SRC_3 AT RS23 - _DBG_2> SOURCE (EXAM/SOURCE .%SOURCE_SCOPE\%PC)
また,プロセス固有のディスプレイに属性を割り当てて,プロセス固有でないディスプレイにすることもできます。 たとえば,次のコマンドは, SRC_3ディスプレイを,現在のスクロール・ディスプレイおよびソース・ ディスプレイにします。すなわち,SCROLL,TYPE,およびEXAMINE/SOURCE の各コマンドの出力はSRC_3に変更されます。
DBG_2> SELECT/SCROLL/SOURCE SRC_3
プロセス指定なしのDISPLAY/PROCESSコマンドを入力すると,指定されたディスプレイが, そのコマンドが入力されたときの可視プロセスに固有のディスプレイとなります。 たとえば,次のコマンドは,OUT_Xをプロセス2 に固有のディスプレイにします。
DBG_2> DISPLAY/PROCESS OUT_X
/SUFFIX修飾子は,可視プロセスを表すプロセス識別接尾辞をディスプレイ名に付加します。 この修飾子は,ディスプレイ名を指定する任意のコマンド, たとえばDISPLAY,EXTRACT,SAVE内のディスプレイ名の後ろに直接付けることができます。 これは,ディスプレイ定義またはディスプレイ定義と結び付けられたキー定義に関連するコマンド・ プロシージャ内で特に役立ちます。
マルチプロセス構成では,プロセス起動時の定義済みのトレースポイントが, 新しくデバッガの制御下に置かれたプロセスごとに,新しいソース・ ディスプレイと新しい機械語命令ディスプレイを自動的に作成します。 これらのディスプレイ名は,それぞれソース・ディスプレイはSRC_ nおよび機械語命令ディスプレイはINST_nという形式になります。 ここで,nはプロセス番号です。これらのディスプレイは, 最初に削除されたものとしてマークされます。それらは, プロセスが終了すると自動的に削除されます。
いくつかの定義済みキーパッド・キー・シーケンスを使用すれば,プロセスが起動されたときに自動的に作成されるプロセス固有のソース・ ディスプレイおよび機械語命令ディスプレイを使用して, 画面を構成できます。 マルチプロセス・プログラム固有のキー・シーケンスは次のとおりです。 PF1 KP9,PF4 KP9,PF4 KP7,PF4 KP3,PF4 KP1。これらのシーケンスの意味については 第A.5節を参照してください。 これらのシーケンスに正確に対応するコマンドを知るには,SHOW KEY コマンドを使用します。
Alphaプロセッサでは,グローバル・セクション内にウォッチポイントを設定できます。 グローバル・セクションは,マルチプロセス・ プログラムのすべてのプロセス間で共有されるメモリ領域です。 グローバル・セクション内のある記憶位置に設定されたウォッチポイント( グローバル・セクション・ウォッチポイント)は,任意のプロセスがその記憶位置の内容を変更したときに検出されます。
SET WATCHコマンドを使用して配列やレコードにウォッチポイントを設定する場合には, 構造体全体を指定するよりも各要素を指定したほうが性能が向上することに注意してください。
グローバル・セクションにマップされていない記憶位置にウォッチポイントを設定すると, そのウォッチポイントは従来の静的なウォッチポイントとして処理されます。 次に例を示します。
DBG_1> SET WATCH ARR(1) DBG_1> SHOW WATCH watchpoint of PPL3\ARR(1)
この後,ARRがグローバル・セクションにマップされると,ウォッチポイントは自動的にグローバル・ セクション・ウォッチポイントとみなされるようになり, それを通知する情報メッセージが発行されます。次に例を示します。
DBG_1> GO %DEBUG-I-WATVARNOWGBL, watched variable PPL3\ARR(1) has been remapped to a global section predefined trace on activation at routine PPL3 in %PROCESS_NUMBER 2 predefined trace on activation at routine PPL3 in %PROCESS_NUMBER 3 watch of PPL3\ARR(1) at PPL3\%LINE 93 in %PROCESS_NUMBER 2 93: ARR(1) = INDEX old value: 0 new value: 1 break at PPL3\%LINE 94 in %PROCESS_NUMBER 2 94: ARR(I) = I
ウォッチされている記憶位置がグローバル・セクションにマップされると, そのウォッチポイントは,次のように,各プロセスから見えるようになります。
DBG_2> DO (SHOW WATCH) For %PROCESS_NUMBER 1 watchpoint of PPL3\ARR(1) [global-section watchpoint] For %PROCESS_NUMBER 2 watchpoint of PPL3\ARR(1) [global-section watchpoint] For %PROCESS_NUMBER 3 watchpoint of PPL3\ARR(1) [global-section watchpoint]
マルチプロセス・デバッグ用のコマンド,修飾子,および組み込みシンボルはすべて, 省略時のデバッグ構成でも認識され(デバッガをDEBUG/KEEP コマンドで起動した場合),同じように動作します(可能な場合)。次に例を示します。
この互換性によって,ユーザは,マルチプロセス・デバッグ用に作成されたコマンド・ プロシージャを,単一プロセス内で動作するプログラムをデバッグするときにも使用できます。
複数のユーザがマルチプロセス・プログラムをデバッグすると,システムに負荷がかかります。 本項では,デバッガが使用するリソースについて説明し, ユーザやシステム管理者が,マルチプロセス・プログラムのデバッグ作業用にシステムを調整できるようにします。
ここでは,デバッガが使用するリソースだけについて説明します。マルチプロセス・ プログラム自体をサポートするには,システムを調整しなくてはならない場合もあります。
各ユーザは,デバッガ用の追加プロセスを作成するために十分なPRCLMクォータを必要とします。 このとき,プログラムの実行に必要な数以上のプロセスを作成できるようにします。
BYTLM,ENQLM,FILLM,およびPGFLQUOTAは,プール・クォータです。これらのクォータは, デバッガ・プロセスを考慮して,次のように増やさなければならないに場合があります。
カーネル・デバッガとメイン・デバッガは,グローバル・セクションを使用して通信します。 メイン・デバッガは,65ページのグローバル・セクションを使用して, 最大8つのカーネル・デバッガと通信します。したがって, システムのグローバル・ページおよびグローバル・セクション・パラメータ( それぞれGBLPAGESおよびGBLSECTIONS)を増やさなければならない場合があります。 たとえば,10人のユーザが同時にデバッガを使用する場合, デバッガは,全体で650ページを使用する1 0個のグローバル・セクションを必要とします。
[ 前のページ ]
[ 次のページ ]
[ 目次 ]
[ 索引 ]
[ DOC Home ]