前へ | 次へ | 目次 | 索引 |
これらのハンドラはデバッガによって制御されます。これらのハンドラは,アプリケーションで宣言されたハンドラが例外を処理していなければ,デバッガに最終的に制御を戻し,DBG> プロンプトを表示します。そうでない場合は,デバッグ・セッションは終了し,DCLコマンド・インタプリタに制御が引き渡されます。
最終ハンドラは,呼び出しスタックの最終フレームであり,これら2つのハンドラのうち最初に起動されるハンドラです。次の例は,処理されていない例外が例外ブレークポイントから最終ハンドラに伝えられ場合,どのように処理されるかを示しています。
DBG> SET BREAK/EXCEPTION DBG> GO . . . %SYSTEM-F-INTDIV, arithmetic trap, integer divide by zero at PC=0000066C, PSL=03C00022 break on exception preceding TEST\%LINE 13 6: X := 3/Y; DBG> GO %SYSTEM-F-INTDIV, arithmetic trap, integer divide by zero at PC=0000066C, PSL=03C00022 DBG> |
この例では,最初のINTDIVメッセージは1次ハンドラによって発行されます。2つ目のメッセージは最終ハンドラによって発行され,その後最終ハンドラによりDBG>プロンプトが表示されています。
ラスト・チャンス・ハンドラは,呼び出しスタックの破損のために最終ハンドラが制御を得ることができなかった場合にだけ起動されます。次に例を示します。
DBG> DEPOSIT %FP = 10 DBG> GO . . . %SYSTEM-F-ACCVIO, access violation, reason mask=00, virtual address=0000000A, PC=0000319C, PSL=03C00000 %DEBUG-E-LASTCHANCE, stack exception handlers lost, re-initializing stack DBG> |
キャッチオール・ハンドラはオペレーティング・システムの一部であり,ラスト・チャンス・ハンドラが制御を得ることができなかった場合に起動されます。キャッチオール・ハンドラはレジスタのダンプを作成します。デバッガがユーザ・プログラムを制御している場合に起動されることはありません。デバッガを使用せずにプログラムを実行しているとき,プログラムでエラーが検出されると起動されます。
デバッグ・セッションの間,レジスタ・ダンプが現れ DCL レベル($)に戻った場合は,弊社のサポート要員にご連絡ください。
14.5.4 例外関連の組み込みシンボル
例外がシグナル通知された場合,デバッガは次の例外関連の組み込みシンボルを設定します。
シンボル | 説明 |
---|---|
%EXC_FACILITY | 現在の例外を発行したファシリティの名前 |
%EXC_NAME | 現在の例外の名前 |
%ADAEXC_NAME | 現在のAda例外の名前(Ada プログラムの場合のみ) |
%EXC_NUMBER | 現在の例外の番号 |
%EXC_SEVERITY | 現在の例外の重大度コード |
これらのシンボルを次のように使用することができます。
次に,これらのシンボルの使用例を示します。WHEN 句の条件式は言語固有ですので注意してください。
DBG> EVALUATE %EXC_NAME 'ACCVIO' DBG> SET TRACE/EXCEPTION WHEN(%EXC_NAME = "ACCVIO") DBG> EVALUATE %EXC_FACILITY 'SYSTEM' DBG> EVALUATE %EXC_NUMBER 12 DBG> EVALUATE/CONDITION_VALUE %EXC_NUMBER %SYSTEM-F-ACCVIO, access violation, reason mask=01, virtual address=FFFFFF30, PC=00007552, PSL=03C00000 DBG> SET BREAK/EXCEPTION WHEN(%EXC_NUMBER = 12) DBG> SET BREAK/EXCEPTION WHEN(%EXC_SEVERITY .NE. "I" .AND. %EXC_SEVERITY .NE. "S") |
終了ハンドラは,イメージがシステム・サービス$EXITを要求したり,実行が終了したりしたときに呼び出されるプロシージャです。ユーザ・プログラムは1つまたは複数の終了ハンドラを宣言することができます。デバッガは常に自分自身の終了ハンドラを宣言します。
プログラム終了時,アプリケーションで宣言された終了ハンドラがすべて実行されたあとにデバッガの終了ハンドラが実行されます。
アプリケーションで宣言された終了ハンドラをデバッグするには,次の手順に従ってください。
終了ハンドラが実行されると,ブレークポイントが有効になり,制御がデバッガに戻る。続いてコマンドの入力を要求するプロンプトが表示される。
SHOW EXIT_HANDLERS コマンドは,ユーザ・プログラムで宣言した終了ハンドラを表示します。終了ハンドラのルーチンは,呼び出された順番に表示されます。ルーチン名は可能であればシンボルとして表示されます。そうでない場合はアドレスが表示されます。デバッガの終了ハンドラは表示されません。次に例を示します。
DBG> SHOW EXIT_HANDLERS exit handler at STACKS\CLEANUP exit handler at BLIHANDLER\HANDLER1 DBG> |
プログラムは,非同期システム・トラップ(AST)を明示的に使用したり,システムサービス,またはアプリケーションで定義された AST ルーチンを呼び出す実行時ライブラリ(RTL)ルーチンを呼び出すことによって,暗黙に使用したりできます。第 14.7.1 項 では,ユーザのプログラムから発行された AST の実行要求を禁止したり許可にしたりすることによってデバッグを行う方法を説明します。
14.7.1 ASTの実行要求の禁止と許可
AST ドライブ式プログラムのデバッグは混乱することがあります。デバッガが実行を続けている間(コマンドを処理したり,例外をトレースしたり,情報を表示したりしている間)に,デバッグ中のプログラムからの割り込みが発生し,処理されないことがあるからです。
省略時の設定では,AST の実行要求はプログラムが実行されている間は許可されています。DISABLE AST コマンドはプログラムが実行されている間の AST の実行要求を禁止し,このような割り込みの発生をキューに登録します。
AST の実行要求は,デバッガの実行中は常に禁止されます。
静的ウォッチポイントが有効な場合,デバッガは,システム・サービス呼び出しの直前に,静的ウォッチポイント,AST,スレッド切り替えをオフにします。デバッガは,システム・サービス呼び出しが終了した直後に再起動します。詳細については,SET WATCH コマンドの項を参照してください。ENABLE AST コマンドは,待ち状態にある AST の実行要求も含め,AST の実行要求を再び許可します。SHOW AST コマンドは,AST の実行要求が禁止されているか許可されているかを示します。
CALL コマンドで呼び出されたルーチンの実行中,AST の実行要求を制御するには,/[NO]ASC 修飾子を使用します。CALL/AST コマンドは,呼び出されたルーチン内の AST の実行要求を許可します。CALL/NOAST コマンドは,呼び出されたルーチン内の AST の実行要求を禁止します。CALL コマンドで /AST も /NOAST も指定しない場合は,前に DISABLE AST コマンドを入力していないかぎり,AST の実行要求は許可されます。
14.8 変換されたイメージのデバッグ(Alpha のみ)
OpenVMS Alpha システムの場合,デバッガは,変換されたイメージのデバッグをサポートしてしません。変換されたイメージをデバッグする必要があるときは,Delta/XDelta デバッガを使用してください。このデバッガの詳細については,『OpenVMS Delta/XDelta Debugger Manual』を参照してください。
14.9 同期化または通信機能を実行するプログラムのデバッグ
同期化または通信を実行する一部のプログラムでは,デバッグで問題が発生することがあります。たとえば,デバッグ中のアプリケーションで $DEQ システム・サービス呼び出しに LCK$M_DEQALL 修飾子が含まれている場合(この修飾子はユーザ・プロセス(カーネル)のデバッガの部分とデバッガのメイン・プロセス間の通信リンクを破壊する)などです。
この問題を回避するには,省略時のモードやマルチプロセス・モードではなく,制限された 1 プロセス・モードを使用して,このアプリケーションをデバッグします。1 プロセス・モードを設定するには,次のコマンドを使用します。
$ DEFINE DBG$PROCESS NONE |
OpenVMS システムでは,デバッガはインライン・ルーチンのデバッグをサポートしません。インライン・ルーチンをデバッグしようとすると,次の例に示すように,デバッガはルーチンにアクセスできないことを示すメッセージを出力します。
%DEBUG-E-ACCESSR, no read access to address 00000000 |
この問題を回避するには,/NOOPTIMIZE 修飾子を使用してプログラムをコンパイルします。
本章では,デバッガの機能のうちマルチプロセス・プログラム(2 つ以上のプロセスで動作するプログラム)独自のものについて説明します。これらの機能を使用して,プロセス情報を表示したり,特定のプロセスの実行を制御することができます。他章で説明した機能と併せて使用してください。
本章で扱うすべてのイメージはデバッグ可能であり,デバッガの制御下に置くことができます。/NOTRACEBACK 修飾子を指定してリンクされたイメージは,デバッガの制御下に置くことはできません。第 1.2 節 で説明したように,イメージのデバッグ時にすべてのシンボル情報にアクセスできるのは,そのモジュールを /DEBUG 修飾子を使用してコンパイルおよびリンクしたときだけです。
OpenVMS Alpha システムの場合,デバッガは,変換されたイメージのデバッグをサポートしてしません。変換されたイメージをデバッグする場合は,Delta/XDelta デバッガを使用してください。Delta/XDelta デバッガの詳細については,『OpenVMS Delta/XDelta Debugger Manual』を参照してください。
15.1 基本的なマルチプロセス・デバッグ方法
この節では,マルチプロセス・デバッグの基本的な概念を紹介します。詳しい情報については,後の節を参照してください。
15.1.1 マルチプロセス・デバッグ・セッションの開始
この項では,マルチプロセス・デバッグ・セッションを開始する最も簡単な方法について説明します。第 15.16.3 項 では,デバッガのその他の起動方法について説明しています。
マルチプロセス・デバッグ・セッションを開始するには,保持デバッガを起動します。次に例を示します。
$ debug/keep OpenVMS Alpha Debug64 Version 7.3 DBG> |
マルチプロセス・デバッグ・セッションでは,デバッガは制御下に置かれた個々の新しいプロセスをトレースします。デバッガは,例 15-1 のような 10 進数のプロセス番号を使って,各プロセスを識別します。
例 15-1 RUN/NEW コマンド |
---|
DBG> SHOW PROCESS Number Name State Current PC * 1 DBGK$$2727282C activated SERVER\__main DBG> RUN/NEW CLIENT process 2 %DEBUG-I-INITIAL, Language: C, Module: CLIENT %DEBUG-I-NOTATMAIN, Type GO to reach MAIN program predefined trace on activation at CLIENT\__main all> SHOW PROCESS Number Name State Current PC * 1 DBGK$$2727282C activated SERVER\__main 2 USER_2 activated CLIENT\__main all> |
例 15-1 の RUN/NEW CLIENT コマンドは,新しいプロセスの中でプログラム CLIENT を起動します。デバッガは,(そのデバッグ・セッションの中で)初めて複数のプロセスが制御下に置かれた時点で,制御下に置かれているすべてのプロセスのセットを識別するためにプロンプトを all> に変更します。
デバッガが複数のプロセスを認識すると,デバッガ・プロンプトは現在のプロセス・セットの識別子の後に右山括弧(>)を続けたものに変更されます。
概念上,各プロセスは,省略時にはデバッガがそのプロセスを制御下に置いたときに割り当てられた一意の 10 進数によって識別される,1 つのプロセスが含まれるセットに属しています。プロセスは複数のセットに属することができます。デバッガの制御下に置かれたすべてのプロセスは,省略時には all という名前のセットにグループ化されます。
DEFINE /PROCESS_SET コマンドを使用すると,ユーザが名前を付けたセットにプロセスをグループ化することができます。
デバッガ・コマンドは,省略時には現在のプロセス・セットに適用されます。省略時の設定では,現在のプロセス・セットは all という名前のセットです。SET PROCESS コマンドを使用すると,現在のプロセス・セットを変更することができます。
コマンドの対象となるプロセスのセットは コマンド・プロセス・セットと呼ばれます。省略時のコマンド・プロセス・セットは,現在のプロセス・セットです。
現在のプロセス・セットを変更することなく,現在のプロセス・セット以外のコマンド・プロセス・セットにデバッガ・コマンドを適用することができます。このためには,コマンドの接頭辞として,プロセス・セットの名前の後に右山括弧(>)を続けます。次に例を示します。
all> 1,2,5> GO |
1,2,5> はプロセス・セット接頭辞です。この構文により,前のコマンド行からコマンドをカットしてペーストすることができます。
可視プロセスは現在のディスプレイに表示されているプロセスのことで,SHOW PROCESS ディスプレイの最左端の欄にアスタリスク(*)が付いています。可視プロセスは SET PROCESS/VISIBLE コマンドで変更できます。次に例を示します。
all> SHOW PROCESS Number Name State Current PC * 1 DBGK$$2727282C activated SERVER\__main 2 USER_2 activated CLIENT\__main all> |
上の例では,プロセス番号 1 が可視プロセスです。
15.2 プロセス情報の取得
現在のデバッグ・セッションの制御下にあるプロセス情報を取得するには,SHOW PROCESS コマンドを使用します。省略時の設定では,SHOW PROCESS コマンドは,デバッガ制御下のすべてのプロセス情報を表示します。(これらはプロセス・セットの全プロセスです。) 例 15-2 は,デバッガ起動直後に表示される情報の1例です。
例 15-2 SHOW PROCESS コマンド |
---|
DBG> SHOW PROCESS/BRIEF/ALL Number Name State Current PC * 1 JONES activated MAIN_PROG\%LINE 2 DBG> |
修飾子 /BRIEF と /ALL は省略時の設定です。また,デバッガはまだ 1 つのプロセスしか制御下に置いていないので,省略時のプロンプトを表示していることに注意してください。SHOW PROCESS コマンドは,指定された各プロセスについて以下の情報を表示します。
状態 | 説明 | |
---|---|---|
Running | デバッガ制御下での実行。 | |
Stopped | ||
Activated | イメージとそのプロセスがデバッガの制御下に置かれた直後。 | |
Break1 | ブレークポイントが検出された。 | |
Interrupted |
次の方法の 1 つで,プロセスの実行が中断された。
|
|
Step1 | STEP コマンドが終了した。 | |
Trace1 | トレースポイントが検出された。 | |
Unhandled exception | 未処理例外が発生した。 | |
Watch of | ウォッチポイントが検出された。 | |
Terminated | イメージの実行は終了したが,プロセスはまだデバッガの制御下に置かれている。したがって,ユーザは,イメージとそのプロセスに関する情報を得ることができる。 |
例 15-2 で,SHOW PROCESS コマンドの後ろに STEP コマンドを入力すると,SHOW PROCESS 表示の状態欄は,ステップ実行完了後,実行が停止していることを示します。次に例を示します。
DBG> STEP DBG> SHOW PROCESS Number Name State Current PC * 1 JONES step MAIN_PROG\%LINE 3 DBG> |
同じように,ブレークポイントを設定した後に GO コマンドを入力した場合,ブレークポイントがトリガされた後に SHOW PROCESS コマンドを入力すると,状態は break と表示されます。
前へ | 次へ | 目次 | 索引 |