| 日本-日本語 | 
      
  | 
  
      
  | 
  
| 
 | 
     
OpenVMS マニュアル | 
    
  
  | 
    
     
HP OpenVMS
 | 
    
    
  
| 目次 | 索引 | 
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 コマンドは,コマンド・プロセス・セットの中のすべての停止中のプロセスを開始します。
 SET MODE [NO]INTERRUPT コマンドを使用すると,割り込みモードの状態を切り替えることができます。割り込みモードがオンになっていると,デバッガは 1 つのプロセスが停止した時点ですべてのプロセスを停止します。割り込まれたプロセスが RTL やシステム・サービス呼び出しの深い位置にある場合には,プロセス・スタック上に無意味な非シンボリック・フレームが多数残るため,不便になることがあります。
 割り込みモードがオフになっていると,デバッガは STOP コマンドが入力されない限り,他のプロセスは停止しません。これは省略時のモードです。
 
STOP コマンドを使用すると,実行中のプロセスに割り込むことができます。 STOP コマンドは,コマンド・プロセス・セットの中のすべての実行中のプロセスに割り込みます。
 STOP コマンドは,コマンド・セットの中のすべての実行中のプロセスに停止要求を送信した時点で完了します。次に例を示します。
 
 
15.8.2 割り込みモード
![]()
15.8.3 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> 
 | 
保持デバッガ・セッションから,デバッグ可能なプログラムをデバッガの制御下に置くことができます。これは,他のプロセス内で独立に実行されているクライアント・プログラムであってもかまいません。デバッガはまだそのプロセスを認識していないため,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$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$HELP,DBG$UIHELP,DEBUGAPPCLASS,および VMSDEBUGUIL) が異なっている場合,CONNECT コマンドを入力すると予期しない結果が生じることがあります。
 プロセスのメイン・イメージが最後まで実行されて完了すると,プロセスは終了デバッグ状態に移行します (オペレーティング・システムのレベルでのプロセス終了と混同してはなりません)。この条件は,省略時の設定で,SET TRACE/TERMINATING コマンドが入力されたかのようにトレースの対象となっています。
 デバッガは終了デバッグ状態になったプロセスも認識しており, SHOW PROCESS ディスプレイに表示します。このため,変数を確認するコマンドなどを入力することができます。
 プロセスを終了せずにそのプロセスをデバッガの制御から解放するには, DISCONNECT コマンドを入力します。一方,プロセスに EXIT または QUIT コマンドを指定すると,そのプロセスは終了します。
 DISCONNECT コマンドは,クライアント/サーバ・モデルのプログラムには必須です。次に例を示します。
 
 
![]()
15.11 イメージの終了のモニタ
![]()
![]()
15.12 デバッガの制御からのプロセスの解放
![]()
all> SHOW PROCESS 
 Number  Name          State            Current PC 
*    1 DBGK$$2727282C  step     SERVER\main\%LINE 18823 
     2 USER1_2         step     CLIENT\main\%LINE 18805 
     3 USER1_3         step     CLIENT\main\%LINE 18805 
all> DISCONNECT 3 
all> SHOW PROCESS 
 Number  Name          State            Current PC 
*    1 DBGK$$2727282C  step     SERVER\main\%LINE 18823 
     2 USER1_2         step     CLIENT\main\%LINE 18805 
all> QUIT 1,2 
DBG> SHOW PROCESS 
  %DEBUG-W-NOPROCDEBUG, there are currently no processes being debugged 
DBG> EXIT 
$ 
 | 
デバッガ・カーネルは,デバッグされているイメージと同じプロセス内で実行されることに注意してください。このプロセスに対して DISCONNECT コマンドを発行すると,プロセスは解放されますが,カーネルはアクティブなままです。この状態はプログラム・イメージが実行を終了するまで続きます。 1 つまたは複数の切断された,しかしアクティブなカーネルがユーザ・プログラム空間を占有しているときに,新しいバージョンのデバッガをインストールすると,そのプログラム・イメージへの再接続を試みたときにデバッガが異常な動作を見せることがあります。
![]()
15.13 特定のプロセスの終了
![]()
デバッグ・セッションを終了することなく,指定したプロセスだけを終了するには,EXIT または QUIT コマンドのパラメータとして 1 つまたは複数のプロセスを指定します。たとえば,
all> SHOW PROCESS 
 Number  Name          State            Current PC 
*    1 DBGK$$2727282C  step     SERVER\main\%LINE 18823 
     2 USER1_2         step     CLIENT\main\%LINE 18805 
all> QUIT 1,2 
DBG> SHOW PROCESS 
  %DEBUG-W-NOPROCDEBUG, there are currently no processes being debugged 
DBG> EXIT 
$ 
 | 
Ctrl/C,または SET ABORT_KEY コマンドによって設定された強制終了キー・シーケンスを押すことによって,現在イメージを実行しているすべてのプロセス内で,実行に割り込みをかけることができます。これは,SHOW PROCESS の表示では,Interrupted 状態として示されます。
Ctrl/C を使用してデバッガ・コマンドを強制終了させることもできます。
また,デバッガ STOP コマンドでプロセスを中止することもできます。
![]()
15.15 デバッグ・セッションの終了
![]()
すべてのデバッグ・セッションを終了するには,何もパラメータを指定しないで EXIT コマンドまたは QUIT コマンドを入力します。
EXIT コマンドは,プログラム内で宣言されている任意の終了ハンドラを実行します。QUIT コマンドは,終了ハンドラを実行しません。
QUIT コマンドは,実行中のプロセスを終了させます。 QUIT コマンドは,終了ハンドラを実行せずに,コマンド・プロセス・セット内のすべての実行中のプロセスを終了させます。 QUIT コマンドの前のプロセス・セット接頭辞は無視されます。次に例を示します。
all> SHOW PROCESS 
 Number  Name          State            Current PC 
*    1 DBGK$$2727282C  step     SERVER\main\%LINE 18823 
     2 USER1_2         step     CLIENT\main\%LINE 18805 
all> QUIT 1,2 
DBG> SHOW PROCESS 
  %DEBUG-W-NOPROCDEBUG, there are currently no processes being debugged 
DBG> EXIT 
$ 
 | 
QUIT コマンドは現在のプロセス・セットを無視します。プロセスを指定しなかった場合,QUIT コマンドはすべてのプロセスを終了した後に,デバッグ・セッションを終了します。
EXIT コマンドは,実行中のプロセスを終了させます。EXIT コマンドは,終了ハンドラを実行し,コマンド・プロセス・セット内のすべての実行中のプロセスを終了させます。EXIT コマンドの前のプロセス・セット接頭辞は無視されます。次に例を示します。
all> SHOW PROCESS 
 Number  Name          State            Current PC 
*    1 DBGK$$2727282C  step     SERVER\main\%LINE 18823 
     2 USER1_2         step     CLIENT\main\%LINE 18805 
all> EXIT 1,2 
DBG> SHOW PROCESS 
  %DEBUG-W-NOPROCDEBUG, there are currently no processes being debugged 
DBG> EXIT 
$ 
 | 
EXIT コマンドは現在のプロセス・セットを無視します。プロセスを指定しなかった場合,EXIT コマンドはすべてのプロセスを終了した後に,デバッグ・セッションを終了します。
 この節では, 第 15.1 節 の内容よりもさらに高度な概念および使用法などの詳細な情報について説明します。
 デバッガは,コードの大部分を含む 
メイン・デバッガ・イメージ (DEBUGSHR.EXE) と,より小さな 
カーネル・デバッガ・イメージ (DEBUG.EXE) の 2 つの部分からなります。このように分割されているため,デバッガとデバッグされるプログラムが干渉し合う可能性が少なくなり,マルチプロセス・デバッグ構成も可能となります。
 保持デバッガの制御下にプログラムを置くと,メイン・デバッガはサブプロセスを作成して,プログラムとカーネル・デバッガを並行に動作させます。
 デバッグ中のアプリケーションは,いくつかのプロセスで実行されます。デバッガ制御下で実行している各プロセスは,カーネル・デバッガのローカル・コピーが実行しています。自身のプロセス内で動作しているメイン・デバッガは,カーネル・デバッガを通して他のプロセスと通信します。
 すべてのプロセスは,同じ UIC グループ内に存在しなければなりませんが,特定のプロセス/サブプロセス関係の中で関連づけられる必要はありません。また,異なるプロセス内で動作するプログラム・イメージが,お互いに通信する必要はありません。
 マルチプロセス・デバッグに関するシステム要件については, 第 15.16.6 項 を参照してください。
 デバッガ・コマンド内でプロセスを指定する場合は,CONNECT コマンドを使用したプロセス指定を除けば, 表 15-2 に示した形式のどれでも使用できます。 
第 15.9 節 を参照してください。
 CONNECT コマンドを使用すると,デバッガがまだ認識していないプロセスをデバッガの制御下に置くことができます。新しいプロセスは,デバッガの制御下に置かれるまではデバッガが割り当てたプロセス番号を持たず,組み込みプロセス・シンボル (%NEXT_PROCESS など) を使って参照することもできません。したがって,CONNECT コマンドにプロセスを指定するには,プロセス名またはプロセス識別子 (PID) のいずれかしか使用できません。  
![]()
15.16 補足情報
![]()
15.16.0.1 デバッグ時のプロセス関係
15.16.1 デバッガ・コマンド内のプロセス指定
![]()
| 形式 | 使用方法 | 
|---|---|
| [%PROCESS_NAME] process-name | スペースや小文字を含まないプロセス名。プロセス名にはワイルドカード文字 (*) を含めることができる。 | 
| [%PROCESS_NAME] " process-name" | スペースまたは小文字を含むプロセス名。二重引用符 (") の代わりに,一重引用符を (') 使用することもできる。 | 
| %PROCESS_PID process_id | プロセス識別子 (PID,16 進数 )。 | 
| [%PROCESS_NUMBER]
process-number
 (または %PROC process-number)  | 
デバッガの制御下に入ったときにプロセスに割り当てられた番号。新しい番号は,1 から順番に各プロセスに割り当てられる。 EXIT コマンドまたは QUIT コマンドによってプロセスが終了した場合,そのデバッグ・セッション中にその番号が再割り当てされることがある。プロセス番号は SHOW PROCESS コマンドを実行して表示できる。プロセスは,組み込みシンボル %PREVIOUS_PROCESS および %NEXT_PROCESS によってインデックスづけできるように,循環リスト内に順序づけされる。 | 
| process-set-name | DEFINE/PROCESS_SET コマンドで定義された,プロセスのグループを表すシンボル。 | 
| %NEXT_PROCESS | デバッガの循環プロセス・リスト中で可視プロセスの次のプロセス。 | 
| %PREVIOUS_PROCESS | デバッガの循環プロセス・リストの中で可視プロセスの前のプロセス。 | 
| %VISIBLE_PROCESS | シンボル,レジスタ値,ルーチン呼び出し,ブレークポイントなどの検索時に,スタック,レジスタ・セット,およびイメージが現在のコンテキストになっているプロセス。 | 
コマンド入力の際は,次のように,組み込みシンボル %PROCESS_NAME および %PROCESS_NUMBER を省略することができます。たとえば,次のようになります。
2> SHOW PROCESS 2, JONES_3  | 
組み込みシンボルの %VISIBLE_PROCESS,%NEXT_PROCESS,および %PREVIOUS_PROCESS は,IF,WHILE,REPEAT の各コマンドに基づいた制御構造内やコマンド・プロシージャ内で利用できます。
| 目次 | 索引 | 
      
  | 
  ||||||||