日本-日本語

製品  >  ソフトウェア  >  OpenVMS  >  マニュアル

OpenVMS マニュアル


≫ 

OpenVMS V7.3-2
ライブラリ

タイトルページ
目次
まえがき
第 1 部:デバッガ概要
第 1 章:デバッガ概要
第 2 部:コマンド・インタフェース
第 2 章:デバッガの起動
第 3 章:プログラム実行の制御とモニタ
第 4 章:プログラム・データの検査と操作
第 5 章:プログラム内シンボルへのアクセス制御
第 6 章:ソース・コードの表示の制御
第 7 章:画面モード
第 3 部:DECwindows インタフェース
第 8 章:DECwindows Motifインタフェースの概要
第 9 章:デバッグ・セッションの開始と終了
第 10 章:デバッガの使用方法
第 4 部:PC クライアント・インタフェース
第 11 章:デバッガの PC クライアント/サーバ・インタフェースの概要
第 5 部:高度なトピック
第 12 章:ヒープ・アナライザの使用
第 13 章:その他の便利な機能
第 14 章:特殊なデバッグ
第 15 章:マルチプロセス・プログラムのデバッグ
第 16 章:ベクタ化されたプログラムのデバッグ
第 17 章:タスキング・プログラムのデバッグ
第 6 部:付録
付録 A :定義済みのキー機能
付録 B :組み込みシンボルと論理名
付録 C :各言語に対するデバッガ・サポートの要約
付録 D :EIGHTQUEENS.C
索引
PDF
OpenVMS ホーム

HP OpenVMS
デバッガ説明書


目次 索引



ユーザのシステムのプログラム・ライブラリ ADA$PREDEFINED にある, Ada の定義済みユニットは /NODEBUG 修飾子を使用してコンパイルされています。定義済みユニットの中で宣言されている名前をデバッガで参照するにはその前に,定義済みユニットのソース・ファイルを ACS EXTRACT SOURCE コマンドでコピーしなければなりません。そして,コピーしたファイルを /DEBUG 修飾子を使用してコンパイルし,適切なライブラリにしてから,/DEBUG 修飾子を付けてプログラムを再リンクする必要があります。

Ada の各コンパイル・コマンドで /NODEBUG 修飾子を使用した場合,デバッグのためにモジュールに含まれるのはグローバル・シンボル・レコードだけです。このときのグローバル・シンボルは,プログラムが他言語のモジュールへエクスポートする名前です。プログラムは次の Ada のエクスポート・プラグマを使用して名前をエクスポートします。

EXPORT_PROCEDURE
EXPORT_VALUED_PROCEDURE
EXPORT_FUNCTION
EXPORT_OBJECT
EXPORT_EXCEPTION
PSECT_OBJECT

ACS LINK コマンドで /DEBUG 修飾子を使用すると,リンカは,実行可能なイメージ内の特定のユニットのクロージャにデバッグの情報をすべて含めます。

C.2.5 ソースの表示

Ada プログラム固有の次の理由から,ソース・コードを表示できないことがあります。

  • Ada の初期化コードまたは確立コードで実行が一時停止される。この初期化コードや確立コードのために,ソース・コードを使用することができない。

  • コピーされたソース・ファイルが,元のコンパイル単位をコンパイルするのに使用したプログラム・ライブラリの中に含まれていない。

  • 外部ソース・ファイルが,そのコンパイル単位が当初コンパイルされたときにあった場所にない。

  • 実行可能なイメージを生成してからソース・ファイルの修正が行われており,コピーされたソース・ファイルや外部ソース・ファイルはすでに存在しない。

Ada プログラムでソース・コードの表示を制御する方法を次に説明します。

コンパイラ・コマンドの /COPY_SOURCE 修飾子 ( 省略時設定 ) が有効な状態でプログラムをコンパイルした場合,表示される Ada のソース・コードは,プログラムを新しくコンパイルしたときのプログラム・ライブラリにあるソース・ファイルをコピーして取得されます。/NOCOPY_SOURCE 修飾子を使用してプログラムをコンパイルした場合,表示されるソース・コードは,プログラムのコンパイル単位に対応する外部ソース・ファイルから取得されます。

コピーされるソース・ファイルのファイル指定,または外部ソース・ファイルのファイル指定は,対応するオブジェクト・ファイルに埋め込まれています。たとえば,コンパイル単位をコピーするのに ACS の COPY UNIT コマンドを使用しても,あるいは,ライブラリ全体をコピーするのに DCL の COPY コマンドか BACKUP コマンドを使用しても,デバッガはコピーされたソース・ファイルから元のプログラム・ライブラリを検索します。コピー後に元のコンパイル単位を修正した場合,またはコピー後に元のライブラリを削除した場合,デバッガはコピーされた元のソース・ファイルを見つけることができません。同様に,外部ソース・ファイルを別のディスクやディレクトリに移動したときも,デバッガは元のソース・ファイルを見つけられません。

このような場合は,ソースの表示のための正しいファイルを検索するために, SET SOURCE コマンドを使用します。プログラム・ライブラリやソース・コードの複数のディレクトリを示す検索リストを指定することができます。次に例を示します。ADA$LIB は,プログラム・ライブラリ・マネージャが現在のプログラム・ライブラリと等しく定義する論理名です。


DBG> SET SOURCE ADA$LIB,DISK:[SMITH.SHARE.ADALIB]

ユーザがデバッガの EDIT コマンドを使用するときにデバッガが取り出す外部ソース・ファイルを検索するための検索リストは, SET SOURCE コマンドでは変更されません。ソース・ファイルを検索する場所を EDIT コマンドで指定するときは,SET SOURCE/EDIT コマンドを使用します。

C.2.6 EDITコマンド

Ada プログラムで省略時にデバッガの EDIT コマンドが取り出す外部ソース・ファイルは,実行を現在一時停止しているコンパイル単位を作成するためにコンパイルされた外部ソース・ファイルです。プログラム・ライブラリ内のコピーされたソース・ファイルは編集しないでください。デバッガはこのソース・ファイルをソースの表示のために使用します。

編集するソース・ファイルのファイル指定は,コンパイル中に,対応するオブジェクト・ファイルに埋め込まれます (/NODEBUG を指定しなかった場合)。コンパイル後にソース・ファイルの配置場所を変更すると,デバッガがそれらのソース・ファイルを見つけられなくなります。

配置場所を変更したときは,デバッガの SET SOURCE/EDIT コマンドを使用すると,デバッガがソース・ファイルを検索する,1 つまたは複数のディレクトリからなる検索リストを指定することができます。次に例を示します。


DBG> SET SOURCE/EDIT [],USER:[JONES.PROJ.SOURCES]

SET SOURCE/EDIT コマンドを使用しても,デバッガがソースの表示に使用するコピー元のソース・ファイルを検索するための検索リストは変更されません。

SHOW SOURCE/EDIT コマンドを使用すると,現在 EDIT コマンドで使用中のソース・ファイル検索リストが表示されます。CANCEL SOURCE/EDIT コマンドを使用すると,現在 EDIT コマンドで使用中のソース・ファイル検索リストが取り消され,省略時の検索モードに戻ります。

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

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

  • コンパイラ生成初期化コード内の命令をステップ実行しないようにするには,デバッグ・セッションを開始するときに,STEP コマンドではなく GO コマンドを使用してください。

    • メイン・プログラムの開始時に初期化コードとパッケージ確立コードをとばして,定義済みブレークポイントに直行するには,GO コマンドを使用します。

    • メイン・プログラムが開始される前の,ライブラリ・パッケージの確立開始時点で実行を一時停止するには,GO コマンドとブレークポイントを使用します。


    パッケージ確立フェーズをモニタする方法については,オンライン・ヘルプの Debugging_Ada_Library_Packages を参照してください。

  • 1 行に複数の文がある場合,STEP コマンドは,その行の文すべてを 1 つのステップの一部分として実行します。

  • タスク・エントリ呼び出しとサブプログラム呼び出しは異なります。タスク・エントリ呼び出しはキューに登録されるのであって,ただちに実行されるとは限らないからです。タスク・エントリ呼び出しに実行を移すのに STEP コマンドを使用すると,期待どおりの結果が得られないことがあります。



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

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

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

  • パッケージの宣言を有効にする。

  • 宣言に初期化コードを含む変数を初期化する。

  • パッケージ本体の begin 文と end 文の間にある一連の文をすべて実行する。

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 種類の例外を認識します。

  • ユーザ定義の例外 --- Ada のコンパイル単位内で,Ada の予約語 exception で宣言された例外

  • Ada の定義済みの例外。PROGRAM_ERROR または CONSTRAINT_ERROR など。

  • その他の (Ada 以外の) すべての例外または VMS 条件

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

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 の例外名は表示されません。

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

%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,または ?)。



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 データの検査と操作

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

  • 非静的変数 ( ライブラリ・パッケージの中で宣言されていないすべての変数 ) の確認,または非静的変数への格納を行うには,その前に,非静的変数を定義するサブプログラムやタスクなどが呼び出しスタック上でアクティブになっていなければなりません。

  • Ada のサブプログラムの仮パラメータまたは Ada の変数を確認したり,格納したり,または評価したりするには,その前にそのパラメータや変数が確立されていなければなりません。つまり,パラメータや変数の宣言の後ろへステップ実行するか,または実行を移さなければなりません。宣言が確立されていない変数や仮パラメータに格納されている値は,違う場合があります。

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


目次 索引

印刷用画面へ
プライバシー 本サイト利用時の合意事項