[ 前のページ ] [ 次のページ ] [ 目次 ] [ 索引 ] [ DOC Home ]

15 マルチプロセス・プログラムのデバッグ

本章では,デバッガの機能のうちマルチプロセス・プログラム(2つ以上のプロセスで動作するプログラム) 独自のものについて説明します。これらの機能を使用して, プロセス情報を表示したり,特定のプロセスの実行を制御することができます。 他章で説明した機能と併せて使用してください。

最初の節では,マルチプロセス・プログラムの2つのマルチプロセス・モデルについて説明します。 残りの各節では,基本的なマルチプロセス・デバッグ方法やマルチプロセス・ コマンドなどについて詳しく説明します。

本章で扱うすべてのイメージはデバッグ可能であり,デバッガの制御下に置くことができます。 デバッグ可能なイメージとは,/NOTRACEBACK修飾子を使用しないでリンクしたイメージのことです。 第1.2節で説明したように, イメージのデバッグ時にすべてのシンボル情報にアクセスできるのは, そのモジュールを/DEBUG修飾子を使用してコンパイルおよびリンクしたときだけです。

OpenVMS Alphaシステムの場合,デバッガは,変換されたイメージのデバッグをサポートしてしません。 変換されたイメージをデバッグする必要があるときは,Delta/XDelta デバッガを使用してください。このデバッガの詳細については, 『OpenVMS Delta/XDelta Debugger Manual』を参照してください。

15.1 マルチプロセス・モデル

マルチプロセス・プログラムは,次の2つのマルチプロセス・モデルのいずれかに従っています。

デバッガのマルチプロセス機能とコマンドは,両方のマルチプロセス・モデルをサポートしていますが, プロセスの関係はデバッガの起動によって異なります。

15.2 基本的なマルチプロセス・デバッグ方法

本節では,マルチプロセス・デバッグ環境の概要と,マルチプロセス・プログラムのデバッグに使用される基本的な方法について説明します。 これ以外の詳細については, 次節以降を参照してください。


注意
生成されたプロセス・イメージをリンクするときに/DEBUG 修飾子を使用する場合や,SPAWNコマンドがイメージを実行するときに/DEBUG 修飾子を使用する場合には,親プロセスは( デバッグ・セッションで) flags引数にNOWAITフラグを設定せずに,子プロセスを生成しなければなりません。

15.2.1 マルチプロセス・デバッグ・セッションの開始

本項では,マルチプロセス・デバッグ・セッションを開始する通常の方法について説明します。 イメージの実行を中断してそのイメージをデバッガの制御下に置くことによってデバッガを起動する別の方法, たとえば, Ctrl/Y-DEBUGシーケンスやCONNECTコマンドを使う方法についての詳しい説明は, 第15.3.4項を参照してください。

マルチプロセス・デバッグ・セッションを開始するには,次のようにします。

  1. すべてのプロセスが同じデバッガ構成を想定していることと, デバッガ構成がMULTIPROCESSであることを確認する。マルチプロセス・ デバッグ構成を設定するには,次の論理名定義を入力する。
         $ DEFINE/GROUP DBG$PROCESS MULTIPROCESS
    

    このコマンドは,プロセスが発生した利用者識別コード(UIC)グループのマルチプロセス・ デバッグ構成を設定する。その結果,同一のUICグループに関連づけられているデバッグ可能なイメージは,1 セッションから制御できるようになる。

    すべてのプロセスがデバッガの同じバージョンを使用していなければならない。 論理名を使用してデバッガ・イメージの起動を制御する場合には, すべてのプロセスが同じ論理名定義を使用するようにしなければならない。

  2. 保持デバッガを起動する。
         $ 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項を参照してください。

15.2.2 可視プロセスとプロセス固有コマンド

前項の例は,マルチプロセス・デバッグ構成のデバッガ・プロンプトは, プログラムがデバッガの制御下に置かれたあとの省略時の構成のプロンプトとは異なることを示しています。

マルチプロセス構成では,動的プロンプト設定(SET PROMPT /SUFFIX=PROCESS_NUMBER)が省略時の設定として使用可能になっています。 したがって,プロンプトには可視プロセスのプロセス番号を示すプロセス固有の接尾辞が付いています。 デバッガは,特定のデバッグ・ セッションの制御下に置かれた各プロセスに対して,プロセス1 から順にプロセス番号を割り当てます。

可視プロセスとは,プロセス固有コマンドを実行する省略時のコンテキストのことです。 プロセス固有コマンドは,実行開始(STEP,GOなど),シンボル検索, ブレークポイントの設定,呼び出しスタックおよびレジスタの確認などを行います。 プロセスに固有でないコマンドは,メモリへのマッピングには依存しませんが, デバッグ環境全体に影響を与えます(たとえば, キーパッド・モードや画面モードのコマンド)。

動的プロンプト設定が使用不能(SET PROMPT/NOSUFFIX)に設定されていないかぎり, デバッガ・プロンプト接尾辞は常に,可視プロセスを示します( たとえば,DBG_1>)。SET PROMPTコマンドには,プロンプト文字列の接頭辞および接尾辞をユーザの要望に合わせるためのオプションがいくつかあります。

15.2.3 プロセス情報の取得

現在のデバッグ・セッションの制御下にあるプロセス情報を取得するには,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行表示は,各プロセスについて次の情報を提供します。

表 15-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を示します。

15.2.4 作成されたプロセスをデバッガの制御下に置く方法

前項の例を使用して説明を続けます。さらに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 コマンドの入力によって予期せぬ結果になることがあります。

15.2.5 指定されたプロセスにコマンドをブロードキャストする方法

省略時の設定では,プロセス固有コマンドは可視プロセスのコンテキスト内で実行されます。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項を参照してください。

15.2.6 実行制御

マルチプロセス・デバッグ環境でのプログラム実行は,次の規則に従います。

これらの概念について,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つの実行モードについて説明します。

15.2.6.1 SET MODE NOINTERRUPTコマンドを使用した実行制御

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 を使用します。

15.2.6.2 特定のプロセスを凍結する方法

前項で説明したように,実行開始コマンドは可視プロセスのコンテキスト内で実行されますが, 同時にそれ以外のプロセスでも実行を開始させます。 あるプロセスでの実行を禁止したい場合には,そのプロセスを凍結します。 たとえば,次の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>

15.2.7 可視プロセスの変更

別のプロセスを可視プロセスとして設定するには,SET PROCESSコマンドを省略時の/VISIBLE 修飾子とともに使用します。たとえば,次のコマンドは, プロセス2を可視プロセスにします。

     DBG_1> SET PROCESS %PROC 2
     DBG_2>

この例では,省略時の設定として動的プロンプト設定が使用可能になっているため,SET PROCESS コマンドによって,プロンプト文字列の接尾辞も変わります。 プロンプトは,プロセス2が可視プロセスであることを示しています。 これで,すべてのプロセス固有コマンドは,プロセス2のコンテキスト内で実行されるようになります。 たとえば,SHOW CALLSコマンドを実行すると, プロセス2内で動作しているイメージの呼び出しスタックが表示されます。

15.2.8 動的プロセス設定

省略時の設定では,動的プロセス設定が使用可能(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コマンドを使用していくつかのプロセス内で実行を開始すると, すべてのプロセス内での実行の停止後に初めて, プロンプトが表示されます。この場合,最後のプロセスがイメージ終了命令を実行して可視プロセスにならないかぎり, 可視プロセスは変更されません。

15.2.9 イメージ終了のモニタ

プロセスのメイン・イメージの実行が終了すると,プロセスはデバッグ終了状態になります。 オペレーティング・システムでのプロセスの終了と混同しないよう注意してください。 この状態は,省略時の設定によって, SET TRACE/TERMINATINGコマンドが入力された場合と同じようにトレースされます。

プロセスがデバッグ終了状態にあるときは,デバッガは,まだそのプロセスを認識しており,SHOW PROCESS/ALL コマンドの実行で表示されます。したがって, コマンドを入力して,変数の検査などを行えます。

プログラムの最後のイメージが終了すると,デバッガは制御を取得し,プロンプトを表示します。

15.2.10 デバッガの制御からのプロセスの解放

プロセスを終了せずにそのプロセスをデバッガの制御から解放するには, DISCONNECTコマンドを入力します。一方,プロセスにEXITまたはQUITコマンドを指定すると, そのプロセスは終了します。

DISCONNECTコマンドは,クライアント/サーバ・モデルのプログラムには必須です。 たとえば,次のコマンドはJONESイメージを切断します。

     DBG> DISCONNECT JONES
     DBG>

DICONNECTコマンドの制約と注意事項に関しては,第15.3.5項を参照してください。

15.2.11 特定のプロセスの終了

デバッグ・セッションを終了することなく,指定したプロセスだけを終了するには,EXIT またはQUITコマンドのパラメータとして1つまたは複数のプロセスを指定します。 たとえば,次のコマンドは,プロセス2で動作しているイメージを終了し, プロセスを終了します。

     DBG_3> EXIT %PROC 2
     DBG_3>

このあと,プロセス2は,SHOW PROCESSコマンドの実行では表示されません。EXIT コマンドおよびQUITコマンドの説明を参照してください。

15.2.12 プログラム実行への割り込み

Ctrl/C,またはSET ABORT_KEYコマンドによって設定された強制終了キー・ シーケンスを押すことによって,現在イメージを実行しているすべてのプロセス内で, 実行に割り込みをかけることができます。これは,SHOW PROCESSの表示では,Interrupted状態として示されます。

省略時の構成と同様,Ctrl/Cを使用してデバッガ・コマンドを強制終了させることもできます。

15.2.13 デバッグ・セッションの終了

すべてのデバッグ・セッションを終了するには,何もパラメータを指定しないでEXIT コマンドまたはQUITコマンドを入力します。

EXITコマンドは,プログラム内で宣言されている任意の終了ハンドラを実行します。QUIT コマンドは,終了ハンドラを実行しません。

したがって,何もパラメータを指定しない場合は,EXITコマンドとQUITコマンドの動作は, 省略時のデバッグ構成の動作と同じです。

15.3 補足情報

この節では,第15.2節の内容よりもさらに高度な概念および使用法などの詳細な情報について説明します。

15.3.1 デバッグ構成とプロセスの関係

ユーザは,デバッガを省略時の構成またはマルチプロセス構成のいずれかの設定で起動することによって, それぞれ1つまたは複数のプロセスで動作するプログラムをデバッグすることができます。

デバッグ構成は,次の表に示すように,論理名DBG$PROCESSの現在の定義によって異なります。

論理名DBG$PROCESSの定義 デバッグ構成
未定義またはDEFAULT 省略時の設定。1 プロセス内で動作するプログラムの構成として使用する。
MULTIPROCESS マルチプロセス。 いくつかのプロセス内で動作するプログラムの構成として使用する。

デバッグ構成は,プログラムが1つまたは複数のプロセス内で動作するかどうかによって決まるのではないことに注意してください。DBG$PROCESS の現在の定義によって決まるのは,異なるプロセスで動作するデバッグ可能なイメージが同じデバッグ・ セッションから制御できるかどうかです。

デバッガを起動する前に,DCLコマンドSHOW LOGICAL DBG$PROCESSを入力して, 現在のDBG$PROCESSの定義とそれに対応するデバッグ構成を確認してください。

15.3.1.1 省略時のデバッグ構成の設定

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

15.3.1.2 マルチプロセス・デバッグ構成の設定

通常,2つ以上のプロセスで動作するプログラムをデバッグするには, マルチプロセス構成を使用します。この構成は,DBG$PROCESSの値がMULTIPROCESS に定義されているときに設定され,いくつかのプロセスと会話できるようになります。 マルチプロセス・デバッグ構成を設定するには, 次のコマンドを使用します。

     $ DEFINE/GROUP DBG$PROCESS MULTIPROCESS

15.3.1.3 デバッグ時のプロセス関係

デバッガは,コードの大部分を含むメイン・デバッガ・イメージ(DEBUGSHR.EXE) と,より小さなカーネル・デバッガ・イメージ(DEBUG.EXE) の2つの部分からなります。このように分割されているため, デバッガとデバッグされるプログラムが干渉し合う可能性が少なくなり, マルチプロセス・デバッグ構成も可能となります。

ユーザがデバッガを起動すると,プロセスが作成され,メイン・デバッガが実行されます。 省略時構成かマルチプロセス構成かに関係なく,あるプロセス内で動作するメイン・ デバッガが存在することによって,一意のデバッグ・ セッションが設定されます。

プログラムがデバッガの制御下に置かれると,メイン・デバッガはサブプロセスを作成して, プログラムとカーネル・デバッガを並行に動作させます。

マルチプロセス構成では,デバッグされるプログラムはいくつかのプロセス内で動作します。 デバッガの制御下で1つまたは複数のイメージを実行している各プロセスは, カーネル・デバッガのローカル・コピーも実行しています。 自身のプロセス内で動作しているメイン・デバッガは,カーネル・ デバッガを通して他のプロセスと通信します。

マルチプロセス構成のすべてのプロセスは,同じUICグループ内に存在しなければなりませんが, 特定のプロセス/サブプロセス関係の中で関連づけられる必要はありません。 また,異なるプロセス内で動作するプログラム・ イメージが,お互いに通信する必要はありません。

マルチプロセス・デバッグに関するシステム要件については,第15.3.9項を参照してください。

15.3.2 デバッガ・コマンド内のプロセス指定

デバッガ・コマンド内でプロセスを指定する場合は,CONNECTコマンドを使用したプロセス指定を除けば, 表 15-2に示した形式のどれでも使用できます。 第15.3.4.2項を参照してください。

CONNECTコマンドは,デバッガがまだ認識していないプロセスをデバッガの制御下に置くために使用します。 したがって,CONNECTコマンドにプロセスを指定するには, プロセス名またはプロセス識別子(PID)のいずれかしか使用できません。 デバッガが割り当てたプロセス番号や,そのプロセスのプロセス組み込みシンボル( たとえば%NEXT_PROCESS)は使用できません。

表 15-2 プロセス指定

形式 使用方法
[%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の各コマンドに基づいた制御構造内やコマンド・ プロシージャ内で利用できます。

15.3.3 プロセスの起動と終了のモニタ

省略時の設定では,トレースポイントは,プロセスがデバッガの制御下に置かれたとき, およびプロセスがイメージ終了命令を実行したときに検出されます。 これらの定義済みトレースポイントは,SET TRACE/ACTIVATING コマンドおよびSET TRACE/TERMINATINGコマンドをそれぞれ入力した場合と同じ結果をもたらします。SET BREAK/ACTIVATING コマンドおよびSET BREAK/TERMINATINGコマンドを使用すれば,これらのイベント発生時にブレークポイントを設定することができます。

定義済みのトレースポイントを取り消すには,CANCEL TRACE/PREDEFINED コマンドを/ACTIVATING修飾子および/TERMINATING修飾子といっしょに使用します。 ユーザ定義の起動時および終了時のブレークポイントを取り消すには,CANCEL BREAK コマンドを/ACTIVATING修飾子および/TERMINATING 修飾子といっしょに使用します。/USER修飾子は,ブレークポイントまたはトレースポイントを取り消す場合の省略時の設定です。

デバッガ・プロンプトは,最初のプロセスがデバッガの制御下に置かれたときに表示されます。 その結果,単一プロセス・プログラムの場合のように, メイン・イメージの実行が開始される前にコマンドを入力できます。

また,デバッガ・プロンプトは,最後のプロセスがイメージ終了命令を実行したときにも表示されます。 その結果,単一プロセス・プログラムの場合のように, プログラムの実行の終了後,コマンドを入力できます。

15.3.4 イメージの実行に割り込みをかけてデバッガに接続する方法

ユーザは,デバッガの制御外で動作しているあるプロセス内のデバッグ可能なイメージに割り込みをかけて, そのプロセスをデバッガに接続することができる。

15.3.4.1 Ctrl/Y-DEBUGシーケンスを使用したデバッガの起動

省略時の構成と同様にマルチプロセス・デバッグ構成でもCtrl/Y-DEBUG シーケンスを使用します(第1.7節を参照) 。

  1. RUN/NODEBUGコマンドを使用してDCLレベルからイメージを実行する。

  2. Ctrl/Yを押して,イメージに割り込みをかける。

  3. DEBUGコマンドを入力して,デバッガを起動する。

次の例は,新しいデバッグ・セッションを開始する方法を示したものです。

     $ 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シーケンスを入力することによっても発生します。

15.3.4.2 CONNECTコマンドを使用したイメージへの割り込み

CONNECTコマンドをパラメータなしで使用する方法については,第15.2.4項を参照してください。CONNECT コマンドをパラメータ付きで使用すると,デバッガの制御外で動作しているデバッグ可能なイメージに割り込みをかけて, それを現在のデバッグ・ セッションの制御下に置くことができます。

イメージを起動するには,次のような方法があります。

次の例では,CONNECTコマンドがプロセスJONES_3内で動作しているイメージに割り込みをかけ, 現在のデバッグ・セッションの制御下に置きます。 プロセスJONES_3は,デバッグ・セッションと同じジョブ内に存在しなければなりません。

     DBG_1> CONNECT JONES_3

プロセスは,デバッグ・セッションに接続されるまでは,デバッガ・プロセス番号では示されないことに注意してください。 したがって,CONNECT コマンドにプロセスを指定するときは,プロセス名またはプロセス識別子(PID) しか使用できません。

CONNECTコマンドには,デバッグ・セッションからプロセスに接続し, Ctrl/Y-DEBUGシーケンスを入力してイメージの実行に割り込みをかけ,デバッガを起動するのと同じ効果があります。 しかし,CONNECTコマンドのほうが入力しやすく, また接続できないプロセスに割り込みをかけることもできます。

15.3.5 指定のプロセスを解放して再開する実行

CONNECTコマンドを入力して,デバッグ可能イメージを中断しプロセスをデバッガの制御下に置いた後は,DISCONNECT コマンドを入力して,そのプロセスを終了せずに解放することができます。 一方,プロセスにEXITまたはQUIT コマンドを指定すると,そのプロセスは終了します。

CTRL/Y-DEBUGシーケンスやRUN/DEBUGコマンドでデバッガを起動する場合,DISCONNECT コマンドの使用法に注意してください。次のような状況は避けてください。

さらに,デバッガ・カーネルはデバッグ中のイメージと同一のプロセスの中で稼動していることに注意してください。 このプロセスにDISCONNECTコマンドを実行すると, プロセスは解放されますが,カーネルはそのまま稼動状態です。 この稼動状態は,プログラム・イメージの実行が終了するまで続きます。 新しいバージョンのデバッガをインストールした場合,切断されているが稼動状態のいくつかのカーネルがユーザ・ プログラム領域を占めていると, デバッガのインストールと動作に関する問題が発生することがあります。

15.3.6 マルチプロセス・デバッグの画面モード機能

画面モード・ディスプレイは,定義済みの場合もユーザ定義の場合も, 省略時の設定によって可視プロセスと関連づけられます。たとえば,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 コマンドを使用します。

15.3.7 グローバル・セクション内でのウォッチポイントの設定(Alpha のみ)

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]

15.3.8 マルチプロセス・コマンドを省略時の構成で使用する方法

マルチプロセス・デバッグ用のコマンド,修飾子,および組み込みシンボルはすべて, 省略時のデバッグ構成でも認識され(デバッガをDEBUG/KEEP コマンドで起動した場合),同じように動作します(可能な場合)。次に例を示します。

この互換性によって,ユーザは,マルチプロセス・デバッグ用に作成されたコマンド・ プロシージャを,単一プロセス内で動作するプログラムをデバッグするときにも使用できます。

15.3.9 マルチプロセス・デバッグのシステム要件

複数のユーザがマルチプロセス・プログラムをデバッグすると,システムに負荷がかかります。 本項では,デバッガが使用するリソースについて説明し, ユーザやシステム管理者が,マルチプロセス・プログラムのデバッグ作業用にシステムを調整できるようにします。

ここでは,デバッガが使用するリソースだけについて説明します。マルチプロセス・ プログラム自体をサポートするには,システムを調整しなくてはならない場合もあります。

15.3.9.1 ユーザ・クォータ

各ユーザは,デバッガ用の追加プロセスを作成するために十分なPRCLMクォータを必要とします。 このとき,プログラムの実行に必要な数以上のプロセスを作成できるようにします。

BYTLM,ENQLM,FILLM,およびPGFLQUOTAは,プール・クォータです。これらのクォータは, デバッガ・プロセスを考慮して,次のように増やさなければならないに場合があります。

15.3.9.2 システム・リソース

カーネル・デバッガとメイン・デバッガは,グローバル・セクションを使用して通信します。 メイン・デバッガは,65ページのグローバル・セクションを使用して, 最大8つのカーネル・デバッガと通信します。したがって, システムのグローバル・ページおよびグローバル・セクション・パラメータ( それぞれGBLPAGESおよびGBLSECTIONS)を増やさなければならない場合があります。 たとえば,10人のユーザが同時にデバッガを使用する場合, デバッガは,全体で650ページを使用する1 0個のグローバル・セクションを必要とします。


[ 前のページ ] [ 次のページ ] [ 目次 ] [ 索引 ] [ DOC Home ]