日本-日本語
日本HPホーム 製品 & サービス OpenVMS製品情報
≫  お問い合わせ


OpenVMS マニュアル


 

OpenVMS ドキュメント
ライブラリ

タイトルページ
目次
まえがき
第 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 章:タスキング・プログラムのデバッグ
第 6 部:付録
付録 A :定義済みのキー機能
付録 B :組み込みシンボルと論理名
付録 C :各言語に対するデバッガ・サポートの要約
付録 D :EIGHTQUEENS.C
索引
PDF
OpenVMS ホーム

HP OpenVMS
デバッガ説明書


目次 索引



デバッガが,指定されたシンボル ( たとえば,変数名 X) を検索できないため,次のようなメッセージを発行した場合,ユーザはモジュールを設定する必要があります。

DBG> EXAMINE X
%DEBUG-E-NOSYMBOL, symbol 'X' is not in the symbol table
DBG>

この節では,モジュール設定と,モジュールの設定または取り消しが必要となる条件について説明します。モジュールの設定には SET MODULE コマンド,取り消しには CANCEL MODULE コマンドをそれぞれ使用します。

/DEBUG コマンド修飾子を使用して,プログラムをコンパイルおよびリンクすると, 第 5.1 節 で説明したように,全シンボル情報がプログラムのソース・コードから実行可能なイメージに渡されます。

シンボル情報は,実行可能なイメージのデバッグ・シンボル・テーブル (DST) とグローバル・シンボル・テーブル (GST) に含まれています。DST には,ローカル・シンボルおよびグローバル・シンボルに関する詳細な情報が含まれます。GST は,DST に含まれるグローバル・シンボル情報をコピーしたものです。

デバッガは,シンボル検索を容易にするために,DST と GST から実行時シンボル・テーブル (RST) にシンボル情報をロードします。 RST は,効率的なシンボル検索のために構築されています。シンボル情報がRST 内に存在しない場合,デバッガはそのシンボルを認識しないか,または正確に解釈しません。

RST はメモリ領域を占有するため,デバッガは,プログラムの実行中に参照されると思われるシンボルを予想しながら,動的にシンボルをロードします。特定のモジュールのすべてのシンボル情報が,一度に RST テーブル内にロードされるため,このローディング・プロセスを モジュール設定 と呼びます。

グローバル・シンボルは,デバッグ・セッション中は常にアクセス可能でなければならないので,プログラムがデバッガの制御下に置かれたとき,すべての GST レコードは,RST 内にロードされます。また,デバッガはメイン・プログラム ( イメージ転送アドレスによって指定されるルーチンであり,デバッグ・セッションの開始時に実行が停止する位置 ) を含むモジュールを設定します。その結果,すべてのグローバル・シンボルと,メイン・プログラムから見えなければならない任意のローカル・シンボルにアクセスできるようになります。

その後,プログラムの実行が中断するたびに,実行が中断しているルーチンを含むモジュールが設定されます。Ada プログラムでは,デバッガは,with 句またはサブユニット関係によって関連づけられた任意のモジュールも設定します (デバッガのオンライン・ヘルプを参照。 Help Language_Support_Ada と入力します)。モジュールの設定によって,ユーザはグローバル・シンボルに加えてそのプログラム記憶位置で見えなければならないシンボルを参照できるようになります。この省略時の動作モードを動的モードと呼びます。モジュールが動的に設定されると,デバッガは次のようなメッセージを発行します。

%DEBUG-I-DYNMODSET, setting module MOD4

モジュール内に定義されているシンボルで,まだ設定されていないものを参照しようとすると,デバッガは,そのシンボルが RST に設定されていないことをユーザに警告します。このような場合は,SET MODULE コマンドを使用して,そのシンボルを含むモジュールを明示的に設定しなければなりません。次に例を示します。

DBG> EXAMINE X
%DEBUG-E-NOSYMBOL, symbol 'X' is not in the symbol table
DBG> SET MODULE MOD3
DBG> EXAMINE X
MOD3\ROUT2\X: 26
DBG>

SHOW MODULE コマンドは,プログラム内のモジュールの一覧を表示し,設定されているモジュールを識別します。

モジュールが設定されると,デバッガは,RST に必要なメモリを自動的に割り当てます。したがって,設定されるモジュール数が増えると,デバッガの処理速度が低下します。性能の低下が問題になる場合は,CANCEL MODULE コマンドを使用して設定モジュール数を減らし,自動的にメモリ領域を解放します。あるいは SET MODE NODYNAMIC コマンドを入力して,動的モードを無効にすることもできます。動的モードが無効の場合,モジュールはデバッグ時に自動的には設定されません。動的モードになっているかどうかを判定するには,SHOW MODE コマンドを使用します。

Adaプログラム固有のモジュール設定についての詳しい説明は,デバッガのオンライン・ヘルプを参照してください (Help Language_Support_Ada と入力します)。

第 5.4 節 では,共用可能イメージをデバッグするときのイメージとモジュールの設定方法について説明します。

5.3 シンボルのあいまいさの解消

シンボルのあいまいさは,シンボル ( たとえば,変数名 X) が 2 つ以上のルーチンまたは他のプログラム単位内で定義されているときに起こります。

ほとんどの場合,デバッガはシンボルのあいまいさを自動的に解消します。それには, 第 5.3.1 項 で説明したように,まず現在設定されている言語の有効範囲および可視性の規則が適用され,次に呼び出しスタック上の呼び出しルーチンの順序に従います。

ただし,多重定義されているシンボルを指定すると,デバッガは次のように応答する場合もあります。

  • ユーザの意図する特定のシンボル宣言を確定できない。次に例を示す。

    DBG> EXAMINE X
    %DEBUG-W-NOUNIQUE, symbol 'X' is not unique
    DBG>
    

  • ユーザが意図している宣言ではなく,現在の有効範囲内で見える宣言を参照する。

このような問題を解決するには,デバッガが,特定のシンボル宣言を検索する範囲をユーザが指定しなければなりません。次の例では,パス名 COUNTER\X によって,変数 X の特定の宣言を一意に指定しています。

DBG> EXAMINE COUNTER\X
COUNTER\X: 14
DBG>

次の各項では,有効範囲の概念とシンボルのあいまいさを解消する方法について説明します。

5.3.1 シンボル検索規則

ここでは,デバッガのシンボル検索方法について説明します。デバッガは,プログラミング言語の有効範囲と可視性の規則,およびデバッガ自身の規則を使用して,発生する可能性の最も高いシンボルのあいまいさを解消します。 第 5.3.2 項 および 第 5.3.3 項 では,ユーザが必要な場合に利用できる補助的な方法について説明します。

デバッガ・コマンド内にシンボルを指定するには,パス名または正確なシンボルを使用します。

パス名を使用すると,デバッガは,パス名接頭識別子によって示される有効範囲内でシンボルを検索します ( 第 5.3.2 項 を参照 )。

パス名接頭識別子を指定しないと,デバッガは,省略時の設定によって,次の段落で説明する方法を使用して実行時シンボル・テーブル (RST) を検索します。この省略時の動作は, 第 5.3.3 項 で説明するように,SET SCOPE コマンドを使用して変更できます。

最初に,デバッガは,現在設定されている言語の有効範囲と可視性の規則に従って,PC 範囲 (有効範囲 0 とも呼ばれる) 内でシンボルを検索します。これは,デバッガは通常,最初に現在の PC 値 ( 現在実行が停止している位置 ) を含むブロック内またはルーチン内を検索することを意味します。シンボルが見つからない場合は,すぐ外側のネスティング・レベルのプログラム単位を検索し,さらにその外側のプログラム単位へと検索を続けます。この方法は言語に依存しますが,多重定義されているシンボルの中から正しい宣言が選択されることを保証します。

しかし,ユーザは,言語によって定義された PC 範囲内で見つかるシンボルだけではなく,プログラム内の任意のシンボルも参照することができます。これは,任意の領域にブレークポイントを設定したり,任意の変数を検査したりするために必要です。PC 範囲内でシンボルが見つからない場合,デバッガは次の手順に従って検索を続けます。

PC 範囲の検索後,デバッガは,必要であれば呼び出し元ルーチンの有効範囲を検索し,見つからなければ,さらにその呼び出し元という要領で検索を続けます。完全な有効範囲検索リスト が,シンボリックに示されます (0, 1, 2, ..., n)。ここで,0 は PC 範囲を示し,n は呼び出しスタック上の呼び出し数を示します。各有効範囲 ( 呼び出しフレーム ) 内では,デバッガはその言語の可視性規則を使用してシンボルを検索します。

呼び出しスタックを基にした,この検索リストを使用すれば,デバッガは多重定義されたシンボルを便利で予測可能な方法で示すことができます。

上記の検索方法を使用しても,シンボルが見つからない場合,デバッガは, RST の残りの部分,すなわち残りの設定モジュールとグローバル・シンボル・テーブル (GST) を検索します。ここまで検索が進むと,デバッガはシンボルのあいまいさを解消しようとしませんが,シンボルが 2 つ以上現れた場合には,次のようなメッセージを発行します。

%DEBUG-W-NOUNIQUE, symbol 'Y' is not unique

SET SCOPE コマンドを使用して,省略時のシンボル検索動作を変更した場合は,CANCEL SCOPE コマンドを使用して,省略時の動作を復元することができます。

5.3.2 シンボルを一意に指定するための SHOW SYMBOL コマンドとパス名の使用

シンボル参照が一意でないことをデバッガが示している場合は,SHOW SYMBOL コマンドを使用して,そのシンボルの可能なパス名をすべて表示し,そのうちの 1 つを指定することによってシンボルを一意に指定します。次に例を示します。

DBG> EXAMINE COUNT
%DEBUG-W-NOUNIQUE, symbol 'COUNT' is not unique
 
DBG> SHOW SYMBOL COUNT
data MOD7\ROUT3\BLOCK1\COUNT 
data MOD4\ROUT2\COUNT 
routine MOD2\ROUT1\ROUT3\COUNT
 
DBG> EXAMINE MOD4\ROUT2\COUNT
MOD4\ROUT2\COUNT: 12
DBG>

SHOW SYMBOL COUNT コマンドは,RST 内に存在するシンボル COUNT のすべての宣言を表示します。COUNT の最初の 2 つの宣言は変数 (データ) です。最後の宣言はルーチン名です。各宣言は,そのパス名接頭識別子とともに表示され,その宣言に到達するためにたどらなければならないパス ( 検索範囲 ) を示しています。たとえば,MOD4\ROUT2\COUNT は,モジュール MOD4 内のルーチン ROUT2 に存在するシンボル COUNT の宣言を示しています。

パス名の形式は,次のとおりです。すなわち,パス名の最も左の要素は,シンボルを含むモジュールを示します。その後,右に移動するに従って,連続してネストされたルーチンおよびブロックが続き,最後にシンボルの特定の宣言 ( 一番右側の要素 ) に到達します。

シンボルは常にパス名とともに表示されますが,ユーザが,デバッガ・コマンドにパス名を指定する必要があるのは,あいまいさを解消する必要があるときだけです。

デバッガは,行番号を他のシンボルと同じように検索します。省略時の設定では,最初に,実行が停止したモジュール内を検索します。よく使用されるパス名の使用法に,任意のモジュール内の行番号を指定する場合があります。次に例を示します。

DBG> SET BREAK QUEUE_MANAGER\%LINE 26

次の例では SHOW SYMBOL コマンドが,グローバル・シンボルを 2 回示しています。これは,グローバル・シンボルが DST と GST の両方に含まれているためです。

DBG> SHOW SYMBOL X
data ALPHA\X                ! グローバル X 
data ALPHA\BETA\X           ! ローカル X 
data X (global)             ! ALPHA\X と同じ
DBG>

共用可能イメージの場合は,その中に含まれるグローバル・シンボルはユニバーサル・シンボルなので,SHOW SYMBOL コマンドは,ユニバーサル・シンボルを 2 回示します ( 第 5.1.2 項 および 第 5.4 節 を参照 )。

パス名は長くなることがあります。ユーザは,次の 3 つの方法でパス名の指定を単純化できます。

  • パス名を簡略化する。

  • パス名として簡単なシンボルを定義する。

  • パス名を指定しなくてもよいように,新しい検索有効範囲を設定する。

パス名を簡略化するには,ネストされたプログラム単位を左から順番に削除して,一意にシンボルを指定するのに十分なパス名だけを残します。たとえば, 第 5.3.2 項 の最初の例では, ROUT3\COUNT は有効な簡略化されたパス名です。

パス名のシンボルを定義するには,DEFINE コマンドを使用します。次に例を示します。

DBG> DEFINE INTX = INT_STACK\CHECK\X
DBG> EXAMINE INTX

新しい検索有効範囲を設定するには,SET SCOPE コマンドを使用します。このコマンドについては, 第 5.3.3 項 を参照してください。

ユーザは,数値パス名を使用して,SHOW CALLS の表示によって示される呼び出しスタック上のルーチンに対応する有効範囲を指定できます。パス名接頭識別子の "0\" は PC 範囲を示し,"1\" は有効範囲 1 ( 呼び出し元の有効範囲 ) を示します。

たとえば,次のコマンドは,それぞれ有効範囲 0 および有効範囲 2 の中で見える,2 つの異なる宣言 Y の現在値を表示します。

DBG> EXAMINE 0\Y
DBG> EXAMINE 2\Y

省略時の設定では,EXAMINE Y コマンドは,EXAMINE 0\Y を意味します。

第 5.3.3 項 の SET SCOPE/CURRENT コマンドの説明を参照してください。このコマンドを使用すれば,省略時の有効範囲検索リストの参照を呼び出しスタックの相対位置に再設定できます。

グローバル・シンボルを一意に指定するには,シンボルの接頭辞としてバックスラッシュ(\) を使用します。たとえば,次のコマンドはグローバル・シンボル X の値を表示します。

DBG> EXAMINE \X



あるルーチンが再帰的に呼び出された場合,同じルーチンに対するいくつかの呼び出しを区別する必要があります。その結果,これらの呼び出しすべてに対して,同じ名前の新しいシンボルが作成されます。

ユーザは,パス名の中に起動番号を含めて,そのルーチンに対する特定の呼び出しを示すことができます。起動番号は,パス名の一番右側のルーチン名の後ろに非負の整数として置かなければなりません。0 は,最も最近の起動を意味します。1 はその前の起動,というように続きます。たとえば,PROG が COMPUTE を呼び出し,COMPUTE が自身を再帰的に呼び出しているとします。各呼び出し時に新しい変数 SUM が生成されるとき,次のコマンドは,COMPUTE の最近の呼び出し時の SUM の値を表示します。

DBG> EXAMINE PROG\COMPUTE 0\SUM

1 つ前の COMPUTE の呼び出し時に生成された変数 SUM を参照するには,上記のパス名の 0 の箇所に 1 を指定します。

起動番号を指定しないと,デバッガは,そのルーチンに対する最近の呼び出しへの参照と仮定します。省略時の起動番号は 0です。

第 5.3.3 項 で説明する SET SCOPE/CURRENT コマンドを参照してください。このコマンドを使用すれば,省略時の有効範囲検索リストの参照位置を呼び出しスタックの相対位置に再設定できます。

5.3.3 シンボル検索の有効範囲を指定する SET SCOPE の使用

省略時の設定では,デバッガはパス名接頭識別子の指定のないシンボルを検索する場合, 第 5.3.1 項 で説明した有効範囲検索リストを使用します。

SET SCOPE コマンドを使用すれば,シンボル検索用の新しい有効範囲を設定できます。その結果,設定された有効範囲内のシンボルを参照するときに,パス名を指定する必要がなくなります。

次の例では,SET SCOPE コマンドを使用して,シンボル検索用の新しい有効範囲としてパス名 MOD4\ROUT2 を設定しています。その後,パス名接頭識別子の指定なしで Y を参照すると,新しい有効範囲内で見える Y の宣言が使用されます。

DBG> EXAMINE Y
%DEBUG-E-NOUNIQUE, symbol 'Y' is not unique
DBG> SHOW SYMBOL Y
data MOD7\ROUT3\BLOCK1\Y 
data MOD4\ROUT2\Y
 
DBG> SET SCOPE MOD4\ROUT2
DBG> EXAMINE Y
MOD4\ROUT2\Y: 12
DBG>

SET SCOPE コマンドによってパス名が設定されると,そのコマンド内に指定したパス名が,パス名で個別に修飾されていないすべての参照に適用されます。

SET SCOPE コマンドには,数値パス名を指定することができます。たとえば次のコマンドは,現在の有効範囲を PC 範囲から 3 コール分さかのぼったルーチン呼び出しに設定します。

DBG> SET SCOPE 3

また,有効範囲検索リストを使用すれば,デバッガがシンボルを検索する順序を指定できます。たとえば,次のコマンドによって,デバッガは最初に PC 範囲 ( 有効範囲 0) を検索し,次にモジュール MOD4 内のルーチン ROUT2 によって示される有効範囲を検索します。

DBG> SET SCOPE 0, MOD4\ROUT2

デバッガの省略時の有効範囲検索リストは,各有効範囲が存在すると仮定すれば次のコマンドを入力した場合と同じです。

DBG> SET SCOPE 0,1,2,3,...,n

この場合,デバッガは,シンボルを見つけるために,呼び出しスタックを順番にさかのぼって検索します。

また,SET SCOPE/CURRENT コマンドを使用して,省略時の有効範囲検索リストの参照位置を呼び出しスタック内の別のルーチンに変更することができます。たとえば,次のコマンドは,有効範囲検索リストを 2,3,4,...,n のように設定します。

DBG> SET SCOPE/CURRENT 2

シンボル検索用の現在の有効範囲検索リストを表示するには, SHOW SCOPE コマンドを使用します。省略時の有効範囲検索リストを復元する ( 第 5.3.1 項 を参照 ) には,CANCEL SCOPE コマンドを使用します。


目次 索引

© 2012 Hewlett-Packard Development Company, L.P.