Compaq OpenVMS
デバッガ説明書


前へ 次へ 目次 索引


C.2.7 GO コマンドと STEP コマンド

Ada プログラムで GO コマンドや STEP コマンドを使用する場合は,次の点に注意してください。

C.2.8 Ada のライブラリ・パッケージのデバッグ

Ada のメイン・プログラム,または Ada のコードを呼び出す Ada 以外のメイン・プログラムが実行されるときに,Ada の実行時ライブラリに対して初期化コードが実行され,プログラムが依存するすべてのライブラリ単位に対して確立コードが実行されます。確立コードは,メイン・プログラムの実行前にライブラリ単位を適切な順序で確立します。ライブラリの仕様と本体,およびそれらのサブユニットもこのプロセスによって確立されます。

ライブラリ・パッケージを確立すると,次の処理が行われます。

Ada プログラムをデバッガの制御下に置くと,初めに,初期化コードの実行前およびライブラリ単位の確立前に実行が一時停止されます。次に例を示します。


DBG> RUN FORMS
Language: ADA, Module: FORMS 
Type GO to reach main program
DBG>

この時点で,GO と入力してメイン・プログラムを開始する前に,注目したいパッケージの仕様や本体にブレークポイントを設定することによって,ライブラリ・パッケージ内の命令を何箇所かステップ実行してチェックすることができます。その後,各パッケージを開始するために GO コマンドを使用します。パッケージの本体にブレークポイントを設定するには,SET BREAK コマンドでパッケージ単位名を指定します。パッケージの仕様にブレークポイントを設定するときは,パッケージ単位名をその後ろにアンダスコア(_)を付けて指定します。

パッケージの本体にブレークポイントを設定しても,その本体に対するデバッガのモジュールが設定されていないときはブレークされません。モジュールが設定されていない場合は,パッケージの仕様のところでブレークされます。このようになるのは,with 句の中で名前を指定されているパッケージの仕様に対するモジュールを,デバッガが自動的に設定するためです。デバッガは,対応するパッケージ本体に対するモジュールを自動的には設定しません(付録 C.2.14 項 を参照)。

また,パッケージの仕様の中で宣言されているサブプログラムにブレークポイントを設定するには,パッケージの本体に対するモジュールをユーザが設定する必要があります。

コンパイラは,ライブラリ・パッケージの中で宣言されているサブプログラムに固有の名前を作成しますので注意してください。これらの名前は,オーバロードされた名前です。または,オーバロードされた名前になることもあります。デバッガの出力には,これらの固有の名前が使用されます。また,使用しないと名前があいまいになる場合は,この固有の名前を各コマンドで使用する必要があります。オーバロードされた名前とシンボルの解決についての詳しい説明は,付録 C.2.15 項 を参照してください。

C.2.9 定義済みブレークポイント

Ada プログラムまたは Ada のコードを呼び出すAda以外のプログラムでデバッガを起動すると,Ada のタスキング例外イベントに対応する 2 つのブレークポイントが自動的に設定されます。これらのブレークポイントは,Ada の実行時ライブラリが存在しているときに,デバッガの初期化中に自動的に設定されます。

この状況で SHOW BREAK コマンドを入力すると,次のようにブレークポイントが表示されます。


DBG> SHOW BREAK
Predefined breakpoint on ADA event "EXCEPTION_TERMINATED" 
    for any value
Predefined breakpoint on ADA event "DEPENDENTS_EXCEPTION" 
    for any value
DBG>

C.2.10 例外のモニタ

Ada プログラムの場合,デバッガは次の 3 種類の例外を認識します。

次の各サブトピックでは,これらの例外をモニタする方法について説明します。

C.2.10.1 すべての例外のモニタ

SET BREAK/EXCEPTION コマンドを使用すると,どの例外または VMS 条件にもブレークポイントを設定することができます。これには,Ada の実行時ライブラリの内部でシグナル通知される特定の VMS 条件も含まれます。これらの条件は言語処理系の機構によるものであり,プログラムの障害を意味するものではありません。また,これらの条件を Ada の例外ハンドラで処理することはできません。プログラムをデバッグ中にこれらの条件が現れる場合は,ブレークポイントを設定するときに,例外の種類を指定することもできます。

SET TRACE/EXCEPTION コマンドの結果,Ada の CONSTRAINT_ERROR 例外のためにトレースポイントが現れるときの例を,次に示します。


DBG> SET TRACE/EXCEPTION
DBG> GO
     ...
%ADA-F-CONSTRAINT_ERRO, CONSTRAINT_ERROR 
-ADA-I-EXCRAIPRI, Exception raised prior to PC = 00000A7C 
trace on exception preceding 
    ADA$RAISE\ADA$RAISE_CONDITION.%LINE 333+12
     ...

内部で例外が発生したサブプログラムを呼び出したとき,または例外発生の対象となったサブプログラムを呼び出したときのトレースバックを SHOW CALLS コマンドで表示する例を次に示します。


DBG> SET BREAK/EXCEPTION DO(SHOW CALLS)
DBG> GO
      ...
%SYSTEM-F-INTDIV, arithmetic trap, integer divide 
     by zero at PC=000008AF, 
PSL=03C000A2 break on exception preceding 
     SYSTEM_OPS.DIVIDE.%LINE 17+6 
     17:      return X/Y;
 module name     routine name       line    rel PC    abs PC 
*SYSTEM_OPS      DIVIDE               17   00000015  000008AF 
*PROCESSOR       PROCESSOR            19   000000AE  00000BAD 
*ADA$ELAB_PROCESSOR 
                 ADA$ELAB_PROCESSOR        00000009  00000809 
                 LIB$INITIALIZE            00000054  00000C36 
 SHARE$ADARTL                              00000000  000398BE 
*ADA$ELAB_PROCESSOR 
                 ADA$ELAB_PROCESSOR        0000001B  0000081B 
                 LIB$INITIALIZE            0000002F  00000C21

この例では,SYSTEM_OPS パッケージの DIVIDE サブプログラムの 17 行目で SS$_INTDIV 条件が発生します。SS$_INTDIV などのいくつかの条件は Ada のある種の定義済みの例外と等価なものとして処理されるという重要な働きを,この例は示しています。

Ada の定義済みの例外と条件を照合するのは,例外部分を持つすべてのフレーム用に Ada に備えられている条件ハンドラです。したがって,Ada の例外名と等価な名前を持った条件によって例外のブレークポイントまたはトレースポイントが検出された場合,メッセージには,システムの条件コード名 だけ が表示され,対応する Ada の例外名は表示されません。

C.2.10.2 特定の例外のモニタ

例外が発生すると,デバッガは次の組み込みシンボルを設定します。この組み込みシンボルを使用すると,特定の例外が発生したときだけ検出されるように,例外のブレークポイントやトレースポイントを指定することができます。

%EXC_FACILITY 例外を生じたファシリティの名前を示す文字列。Ada の定義済みの例外およびユーザ定義の例外のファシリティ名は,ADA。
%EXC_NAME 例外名を示す大文字の文字列。発生した例外が Ada の定義済みの例外の場合,15 文字を超える分の名前は切り捨てられる。たとえば,CONSTRAINT_ERROR は切り捨てられ,CONSTRAINT_ERRO になる。発生した例外がユーザ定義の例外の場合,%EXC_NAME には "EXCEPTION" という文字列が入り,ユーザ定義の例外名は %ADAEXC_NAME に入る。
%ADAEXC_NAME 発生した例外がユーザ定義の例外の場合,%ADAEXC_NAME にはその例外名を示す文字列が入り,%EXC_NAME には "EXCEPTION" という文字列が入る。発生した例外がユーザ定義の例外ではない場合,%ADAEXC_NAME には空文字列が入り,%EXC_NAME に例外名が入る。
%EXC_NUM 例外の個数。
%EXC_SEVERITY 例外の重大度を示す文字列(F,E,W,I,S,または ?)。

C.2.10.3 処理される例外と例外ハンドラのモニタ

SET BREAK/EVENT コマンドと SET TRACE/EVENT コマンドを使用すると,Ada の例外ハンドラが処理しようとしている例外にブレークポイントとトレースポイントを設定することができます。制御を渡される Ada の各例外ハンドラの実行を,これらのコマンドでモニタすることができます。

これらのコマンドでは,次の 2 つのイベント名を指定することができます。

HANDLED 何らかの Ada の例外ハンドラが例外を処理しようとしているときに検出される。(HANDLED_OTHERSを含む)
HANDLED_OTHERS Otherを選択している Ada の例外ハンドラが例外を処理しようとしているときのみ検出される。

たとえば,次のコマンドは,Ada の例外ハンドラが例外を処理しようとしているときに検出されるブレークポイントを設定します。


DBG> SET BREAK/EVENT=HANDLED

ブレークポイントが検出されると,処理されようとしている例外と実行されようとしている例外ハンドラをデバッガが示します。その後,この情報を利用して特定のハンドラにブレークポイントを設定することができます。また,GO コマンドを入力して,Ada のどのハンドラが次に例外を処理しようとするかを見ることもできます。次に例を示します。


DBG> GO
     ...
break on Ada event HANDLED 
  task %TASK 1 is about to handle an exception 
  The Ada exception handler is at: PROCESSOR.%LINE 21 
    %ADA-F-CONSTRAINT_ERRO, CONSTRAINT_ERROR 
    -ADA-I-EXCRAIPRI, Exception raised prior to PC = 00000A7C
DBG> SET BREAK PROCESSOR.%LINE 21; GO

C.2.11 データの検査と操作

データを検査または操作するときは,次の関連事項に注意してください。

型明示式の使用も含め,デバッガではほとんどの場合,プログラムのソース・コードに指定するのとまったく同じように,変数や式をデバッガ・コマンドの中で指定することができます。次の各サブトピックでは,レコードとアクセス型についてのデバッガのサポートに関する補足事項について説明します。

C.2.11.1 レコード

デバッガによるレコードのサポートについては次の点に注意してください。

C.2.11.2 アクセス型

デバッガによるアクセス型のサポートについては,次の点に注意してください。

不完全型についてのデバッガのサポートの例を示します。次の宣言を見てください。


package P is
   type T is private; 
private
   type T_TYPE; 
   type T is access T_TYPE; 
end P; 
 
package body P is
   type T_TYPE is
      record
        A: NATURAL := 5; 
        B: NATURAL := 4; 
      end record; 
 
   T_REC: T_TYPE; 
   T_PTR: T := new T_TYPE'(T_REC); 
end P; 
 
with P; use P; 
procedure INCOMPLETE is
   VAR: T; 
begin
   ...
end INCOMPLETE; 

T 型についての完全な情報がデバッガに与えられていないので,VAR 変数を操作することはできません。ただし,パッケージ本体 P の中で宣言されているオブジェクトについては情報が与えられているので,T_PTR 変数と T_REC 変数を操作することはできます。

C.2.12 モジュール名とパス名

Ada のデバッガ・モジュール名は,対応するコンパイル単位の名前と同じです。これには次の条件があります。あいまいさをなくすために,仕様の名前にアンダスコア文字(_)を追加して仕様と本体の名前とを区別してください。たとえば,TEST(本体),TEST_(仕様)とします。プログラム内のモジュールの正確な名前を確認するには,SHOW MODULE コマンドを使用します。

ほとんどの場合,パス名を指定する際に,仕様と本体とを区別するアンダスコアを後部に入力する必要はありません。通常,デバッガは状況に応じてこの 2 つを区別します。したがって,あいまいさを解消しなければならないときだけ,この命名規則を使用してください。

デバッガの言語が Ada に設定されている場合,デバッガは,パス名の要素を区切るのに選択要素の表記法を一般的に使用し,Ada の規則に従ってパス名を構成します。他の言語では要素を区切るのにバックスラッシュを使用します。次に例を示します。


TEST_.A1        ! A1 はコンパイル単位 TEST のパッケージ 
                ! 仕様の中で宣言されている 
TEST.B1         ! B1 はコンパイル単位 TEST のパッケージ 
                ! 本体の中で宣言されている 

サブユニットのパス名(展開される名前)は,最大 247 文字の長さまで指定することができます。

シンボルがパッケージの外部で直接に可視になるよう,パッケージ内で use 句によって宣言されている場合は,プログラム自体またはデバッガ・コマンドのいずれにおいても,そのシンボルを参照するために,展開された名前(package-name.symbol)を指定する必要はありません。

指定されたブロック,サブプログラム,またはパッケージが use 句の中で参照しているパッケージを示すには,SHOW SYMBOL/USE_CLAUSE コマンドを使用します(指定されているパッケージがライブラリであるかどうかは関係ありません)。指定されている要素が,ライブラリであるかどうかにかかわらずパッケージである場合は,use 句内の特定のモジュール名を示すブロック,サブプログラム,パッケージなどもこのコマンドで示すことができます。次に例を示します。


DBG> SHOW SYMBOL/USE_CLAUSE B_
package spec B_ 
    used by:  F 
    uses:     A_

ソース・コードのループ文または宣言ブロックにラベルが付けられている場合,デバッガはそのラベルを表示します。それ以外の場合,ループ 文については LOOP$n を表示し,宣言 ブロックについては BLOCK$n を表示します。それぞれのn は,その文またはブロックが始まる行番号を示します。


前へ 次へ 目次 索引