Compaq OpenVMS
デバッガ説明書


前へ 次へ 目次 索引


15.3 プロセス指定

デバッガが接続する個々の新規プロセスは, プロセス番号によって識別されます。最初のプロセスにはプロセス番号 1,次のプロセスにはプロセス番号 2 が割り当てられます。プロセスが停止すると,そのプロセス番号はリサイクルされ,デバッガはそれ以降のプロセスに同じ番号を割り当てられるようになります。

プロセスはプロセス指定を使って参照されます。最も単純なプロセス指定は,プロセスの作成時に OpenVMS が作成するプロセス名と,デバッガがプロセスを制御下に置くときに作成するプロセス番号です。番号だけから構成されるプロセス指定はプロセス番号として解釈されます。デバッガ・コマンドの中では,プロセス番号を使って個々のプロセスを指定することができます (例: "2,3,4,5")。

プロセス指定項目としては名前を使用することができ,その場合にはプロセス名またはプロセス・セット名を参照することができます。デバッガはまずその名前を持つプロセス・セットを探します。これに失敗した場合,デバッガはその名前を持つプロセスを探します。 %PROCESS_NAME レキシカル関数を使用すると,明示的にプロセス名を指定することができます。

例 15-3 は,完全なプロセス指定構文を示しています。

例 15-3 プロセス指定構文

        process-spec ::=   process-spec-item [, process-spec-item] 
        
        process-spec-item ::= named-item | 
                              numbered-item | 
                              pid-item | 
                              process-set-name | 
                              special-item 
         
        named-item ::=     [%PROCESS_NAME] wildcard-name 
 
        numbered-item ::=  numbered-process 
 
        numbered-process ::= [%PROCESS_NUMBER] decimal-number 
 
        pid-item  ::=      %PROCESS_ID VMS-process-identifier 
 
        process-set-name ::= name 
        
        special-item ::=   %NEXT_PROCESS | 
                           %PREVIOUS_PROCESS | 
                           %VISIBLE_PROCESS 
 

15.4 プロセス・セット

DEFINE PROCESS_SET コマンドの後に,カンマ (,) で区切ったプロセスのリストを指定することで,プロセスをプロセス・セットと呼ばれるグループに入れることができます。次に例を示します。


all> DEFINE/PROCESS CLIENTS = 2,3 
all> SET PROCESS CLIENTS 
clients> STEP 
process 2,3 
  stepped to CLIENT\main\%LINE 18796 
   18796:     status = sys$crembx (0, &mbxchan, 0, 0, 0, 
                               0, &mbxname_dsc, CMB$M_READONLY, 0); 
clients> SHOW PROCESS CLIENTS 
 Number  Name          State            Current PC 
     2 USER1_2         step     CLIENT\main\%LINE 18796 
     3 USER1_3         step     CLIENT\main\%LINE 18796 
clients> 

all という名前の定義済みのプロセス・セットは,デバッガが初めて起動されたときの省略時のプロセス・セットとなっています。このプロセス・セットを再定義することはできません。

現在のプロセス・セット

デバッグ・セッションの中では,つねに現在のプロセス・セットが有効となっています。現在のプロセス・セットは,デバッガのプロセス依存コマンドが省略時の設定として適用されるプロセスのグループです。プロセスに依存するデバッガ・コマンドの一覧については, 第 15.6 節 を参照してください。

省略時の設定では,現在のプロセス・セットはすべてのプロセスのセットで,プロセス・セット名は all となっています。現在のプロセス・セットは SET PROCESS コマンドで変更できます。

SET PROCESS コマンドは 3 つの機能を持っています。

修飾子なしで使用した場合,SET PROCESS コマンドは,現在のプロセス・セットを指定するプロセス指定を単一パラメータとして取ります。次に例を示します。


all> SET PROCESS 1 
1> STEP 
process 1 
  stepped to SERVER\main\%LINE 18800 
   18800:     if (!(status & 1)) 
1> SET PROCESS ALL 
all> 

SET PROCESS/DYNAMIC コマンドは,STEP コマンドの完了やブレークポイントのトリガといったデバッガ・イベントが発生したときに,可視プロセスを変更するようにデバッガに指示します。イベントをトリガしたプロセスが可視プロセスになります。次に例を示します。


all> SET PROCESS/DYNAMIC 
all> 1> STEP 
process 1 
  stepped to SERVER\main\%LINE 18808 
   18808:     df_p = fopen (datafile, "r+"); 
all> SHOW PROCESS/VISIBLE 
 Number  Name          State            Current PC 
*    1 DBGK$$2727282C  step     SERVER\main\%LINE 18808 
all> 

コマンド・プロセス・セット

コマンド・プロセス・セットは,デバッガ・コマンドが適用されるプロセスのグループです。省略時の設定では,コマンド・プロセス・セットは現在のプロセス・セットです。プロセス・セット接頭辞を使用して,現在のコマンドの対象となるコマンド・プロセス・セットを指定することができます。この場合には,その 1 つのコマンドについてのみ,現在のプロセス・セットが上書きされます。次に例を示します。


all> 2,3> STEP 
processes 2,3 
  stepped to CLIENT\main\%LINE 18797 
   18797:     if (!(status & 1)) 
all> clients> STEP 
processes 2,3 
  stepped to CLIENT\main\%LINE 18805 
   18805:     memset (&myiosb, 0, sizeof(myiosb)); 
all> 

プロセス独立コマンドは,現在のプロセス・セットと同様に,プロセス・セット接頭辞をすべて無視します。

15.5 デバッガ・プロンプト

省略時の設定では,デバッガ・コマンド・プロンプトは,プロセス指定と同じ構文を使用して,現在のプロセス・セットを示しています。コマンド・プロンプトは,現在のプロセス・セットのプロセス指定の後に右山括弧 (>) を続けたものです。現在のプロセス・セットを定義すると,デバッガは現在のプロセス・セットの名前の後に右山括弧を続けたものにプロンプトを変更します。次に例を示します。


        all>        ! by default, current process set is all processes 
        all> 
        all> SET PROCESS 2,3,4,5 
        2,3,4,5> DEFINE /PROCESS_SET interesting 1,2,3,7 
        2,3,4,5> SET PROCESS interesting 
        interesting> SET PROCESS * 
        all> SET PROCESS 3 
        3> 
 

注意

デバッガは複数のプロセスを認識するまで,プロセス指定形式のデバッガ・プロンプトを使用しません。

15.6 プロセス依存コマンド

コマンドにはプロセス依存コマンドとプロセス独立コマンドの 2 つの種類があります。

プロセス依存コマンドは,GO,STEP,CALL,および SET BREAK のように,プロセスの状態に依存するコマンドです。

プロセス独立コマンドは,SET DISPLAY,WAIT,ATTACH,および SPAWN のように,デバッガの状態に依存し,またデバッガの状態に影響を与え,プロセスの状態は無視するコマンドです。

15.7 可視プロセスとプロセス依存コマンド

可視プロセスは,省略時の設定でソース・ディスプレイ (およびその他のプロセス指向のディスプレイ) に表示されるプロセスです。 SET PROCESS コマンドで現在のプロセス・セットが変更されると,可視プロセスはそのコマンドで指定された最初のプロセスに設定されます。 SET PROCESS/VISIBLE コマンドを使用すると,現在のプロセス・セットを変更せずに,特定のプロセスを可視プロセスとして指定することができます。

15.8 プロセス実行の制御

複数のプロセスを持つアプリケーションをデバッグするときには,他のプロセスの実行中に特定のプロセスを停止するということがよく行われます。すべてのプロセスが停止するのを待たずに,停止されたプロセスに対してのみコマンドを指定できると便利です。このような機能は WAIT モードによって実現されています。

15.8.1 WAIT モード

プロセスの実行に関しては,デバッガは WAIT モードと NOWAIT モードの 2 つのモードを持っています。SET MODE [NO]WAIT コマンドを使って WAIT モードを切り替えることで,デバッガが新たなコマンドを受け付けて実行するまでに,すべての実行中のプロセスが停止するのを待つかどうかを制御することができます。省略時の設定は WAIT モードです。

デバッガが WAIT モードになっているときに GO,STEP,または CALL コマンドを入力すると,デバッガはコマンド・プロセス・セットに含まれるすべてのプロセスでそのコマンドを実行し,これらのプロセスが (たとえばブレークポイントで) すべて停止するまで待ってから,プロンプトを表示し,新たなコマンドを受け付けます。

デバッガが NOWAIT モードになっているときに GO,STEP,または CALL コマンドを入力すると,デバッガはコマンド・プロセス・セットに含まれるすべてのプロセスでそのコマンドを実行し,ただちにプロンプトを表示します。この際には,すべてのプロセスが停止しているかどうかにかかわらず,ただちに新しいコマンドを入力することができます。この機能は,特にマルチプロセス・プログラムをデバッグしているときには,高度な柔軟性を提供してくれます。

WAIT モードを制御することによって,以下のような操作が可能となります。

SET MODE [NO]WAIT コマンドは,次の SET MODE [NO]WAIT コマンドが入力されるまで有効となります。次に例を示します。


all> SET MODE NOWAIT 
all> clients> STEP 
all> SHOW PROCESS 
 Number  Name          State            Current PC 
     1 DBGK$$2727282C  step     SERVER\main\%LINE 18819 
     2 USER1_2         running          not available 
*    3 USER1_3         running          not available 
all> 

WAIT コマンドを使用して,1 つのコマンドの間だけ NOWAIT モードを無効にし,コマンド・プロセス・セット内のすべてのプロセスが停止するのを待ってから新たなコマンドを受け付けるようデバッガに指示することができます。このコマンドが完了すると,NOWAIT モードが有効となります。次に例を示します。


all> GO;WAIT 
processes 2,3 
  break at CLIENT\main\%LINE 18814 
        18814:       status = sys$qiow (EFN$C_ENF,  mbxchan, 
IO$_READVBLK|IO$M_WRITERCHECK, &myiosb, 
process 1 
  break at SERVER\main\%LINE 18834 
        18834:       if ((myiosb.iosb$w_status ==  
                          SS$_NOREADER) && (pos_status != -1)) 
all> 

コマンドが非対話的に処理されるとき (FOR,REPEAT,WHILE,IF,および @ コマンドの中や,WHEN 句の中のデバッガ・コマンド・シーケンス),省略時の設定で,コマンド・シーケンスの中では WAIT モードが有効となります。

NOWAIT モードでは,EXAMINE コマンドは (すべてのプロセス独立コマンドと同様に) コマンド・プロセス・セットの中の停止されたプロセスの結果を表示します。コマンド・プロセス・セットの中のすべてのプロセスが実行中だった場合, EXAMINE コマンドはその旨を報告し,デバッガはプロンプトを表示して,新しいコマンドを受け付けるようになります。同じように,NOWAIT モードでの GO コマンドは,コマンド・プロセス・セットの中のすべての停止中のプロセスを開始します。

15.8.2 割り込みモード

SET MODE [NO]INTERRUPT コマンドを使用すると,割り込みモードの状態を切り替えることができます。割り込みモードがオンになっていると,デバッガは 1 つのプロセスが停止した時点ですべてのプロセスを停止します。割り込まれたプロセスが RTL やシステム・サービス呼び出しの深い位置にある場合には,プロセス・スタック上に無意味な非シンボリック・フレームが多数残るため,不便になることがあります。

割り込みモードがオフになっていると,デバッガは STOP コマンドが入力されない限り,他のプロセスは停止しません。これは省略時のモードです。

15.8.3 STOP コマンド

STOP コマンドを使用すると,実行中のプロセスに割り込むことができます。 STOP コマンドは,コマンド・プロセス・セットの中のすべての実行中のプロセスに割り込みます。

STOP コマンドは,コマンド・セットの中のすべての実行中のプロセスに停止要求を送信した時点で完了します。次に例を示します。


all> SHOW PROCESS 
 Number  Name          State            Current PC 
     1 DBGK$$2727282C  break    SERVER\main\%LINE 18834 
     2 USER1_2         running          not available 
*    3 USER1_3         running          not available 
all> clients> STOP 
all> SHOW PROCESS 
 Number  Name          State            Current PC 
     1 DBGK$$2727282C  break    SERVER\main\%LINE 18834 
     2 USER1_2         interrupted   0FFFFFFFF800F7A20 
*    3 USER1_3         interrupted   0FFFFFFFF800F7A20 
all> 

15.9 他のプログラムへの接続

保持デバッガ・セッションから,デバッグ可能なプログラムをデバッガの制御下に置くことができます。これは,他のプロセス内で独立に実行されているクライアント・プログラムであってもかまいません。デバッガはまだそのプロセスを認識していないため,SHOW PROCESS コマンドでプロセスに関する情報を得ることはできません。 CONNECT コマンドを入力し,デバッガの %PROCESS_NAME レキシカル関数を使用して,クライアント・プログラムのプロセス名を指定してください。次に例を示します。


all> CONNECT %PROCESS_NAME CLIENT2 
process 3 
  predefined trace on activation at 0FFFFFFFF800F7A20 
all> SHOW PROCESS 
 Number  Name          State            Current PC 
*    1 DBGK$$2727282C  activated        SERVER\__main 
     2 USER1_2         activated        CLIENT\__main 
     3 CLIENT2         interrupted   0FFFFFFFF800F7A20 
                        activated 
all> 

デバッガのメイン・プロセスとクライアントが実行されているプロセスの間で,いずれかのデバッガ論理名 (DEBUG,DEBUGSHR,DEBUGISHR,DBGTBKMSG,DBG$PROCESS,DBG$HELP, DBG$UIHELP,DEBUGAPPCLASS,および VMSDEBUGUIL) が異なっている場合, CONNECT コマンドを入力すると予期しない結果が生じることがあります。

15.10 スポーンされたプロセスへの接続

保持デバッガでデバッグ中のプログラムがデバッグ可能なプロセスをスポーンしたとき,スポーンされたプロセスはデバッガに未接続の状態のまま待機しています。この時点で,デバッガは新しくスポーンされたプロセスに関する情報を持っておらず,SHOW PROCESS コマンドでそのプロセスに関する情報を得ることはできません。新しくスポーンされたプロセスをデバッガの制御下に置くには,次のいずれかの方法を使用します。

次に,CONNECT コマンドの使用時の例を示します。


1> STEP
stepped to MAIN_PROG\%LINE 18 in %PROCESS_NUMBER 1 
18:        LIB$SPAWN("RUN/DEBUG TEST",,,1)
1> STEP
stepped to MAIN_PROG\%LINE 21 in %PROCESS_NUMBER 1 
21:         X = 7
1> CONNECT
predefined trace on activation at routine TEST in %PROCESS_NUMBER 2
all>

この例の第 2 の STEP コマンドは,プロセスをスポーンする LIB$SPAWN 呼び出しを通り過ぎます。 CONNECT コマンドは待機中のプロセスをデバッガの制御下に置きます。 CONNECT コマンドを入力したときには,プロセスが接続されるまでしばらく待たなければならないことがあります。 "predefined trace on..." というメッセージは,デバッガがプロセス 2 として識別された新しいプロセスを制御下に置いたことを示しています。

この時点で SHOW PROCESS コマンドを入力すると,各プロセスのデバッグ状態と,実行が停止されている位置が表示されます。


all> SHOW PROCESS
 Number  Name             State          Current PC 
*    1 JONES              step           MAIN_PROG\%LINE 21 
     2 JONES_1            activated      TEST\%LINE 1+2
all>

CONNECT コマンドは,デバッガへの接続を待っているすべてのプロセスをデバッガの制御下に置くことに注意してください。待機中のプロセスがない場合は, Ctrl/C を押して CONNECT コマンドを強制終了し, デバッガ・プロンプトを表示させることができます。

デバッガ・プロセスとスポーンされたプロセスの間で,いずれかのデバッガ論理名 (DEBUG,DEBUGSHR,DEBUGISHR,DBGTBKMSG, DBG$PROCESS,DBG$HELP,DBG$UIHELP,DEBUGAPPCLASS,および VMSDEBUGUIL) が異なっている場合,CONNECT コマンドを入力すると予期しない結果が生じることがあります。

15.11 イメージの終了のモニタ

プロセスのメイン・イメージが最後まで実行されて完了すると,プロセスは終了デバッグ状態に移行します (オペレーティング・システムのレベルでのプロセス終了と混同してはなりません)。この条件は,省略時の設定で,SET TRACE/TERMINATING コマンドが入力されたかのようにトレースの対象となっています。

デバッガは終了デバッグ状態になったプロセスも認識しており, SHOW PROCESS ディスプレイに表示します。このため,変数を確認するコマンドなどを入力することができます。


前へ 次へ 目次 索引