前へ | 次へ | 目次 | 索引 |
シンボル・レコードは,実行可能なイメージ内で領域を占有します。プログラムのデバッグ終了後,実行可能なイメージを小さくするために,/DEBUG 修飾子を使用しないで再度リンクする場合があります。この場合,DST(トレースバック・データのみ)および GST を含むイメージが作成されます。
LINK/NOTRACEBACK コマンドを使用すると,デバッグの終了後,イメージ内容をユーザによる変更から保護することができます。このコマンドは,特権を使用してインストールする必要のあるイメージに使用します。(『OpenVMS システム管理者マニュアル』および 『Compaq OpenVMS システム管理ユーティリティ・リファレンス・マニュアル』 を参照してください。)/NOTRACEBACK 修飾子を LINK コマンドと使用すると,トレースバック・データを含むシンボル情報はイメージに渡されません。
5.1.5 個別のシンボル・ファイルの作成(Alpha のみ)
Alpha システムでは,/DSF 修飾子を使用してプログラムをリンクすることにより,シンボル情報を格納した個別のファイルを作成できます。省略時の設定では,シンボル・ファイルは,LINK ユーティリティで作成される実行可能ファイルと同じファイル名であり,ファイル・タイプは .DSF です。次の例を参照してください。
$ CC/DEBUG/NOOPTIMIZE TESTPROGRAM.C $ LINK/DSF TESTPROGRAM $ DEFINE DBG$IMAGE_DSF_PATH SYS$DISK:[] $ DEBUG/KEEP TESTPROGRAM |
この例では,次の処理が実行されます。
このプローシージャを使用すると,これまでより小さい実行可能ファイルを作成し,しかもデバッグのためにグローバル・シンボル情報を使用できます。インストール済み常駐ファイルなど,特定のアプリケーションでは,実行可能ファイルにシンボル・テーブルを格納できません。さらに,.DSF ファイルを使用すると,シンボル・テーブルを含まない実行可能ファイルを顧客に配布することができ,しかも将来デバッグが必要になったときのために,別に .DSF ファイルを保存しておくことができます。
デバッグを簡単にするために,プログラムをコンパイルするときは,/NOOPTIMIZE 修飾子を使用してください(可能な場合)。最適化されたコードのデバッグについては,第 14.1 節 を参照してください。 |
別にシンボル(.DSF)ファイルが作成された実行可能ファイルをデバッグするには,次の条件を満たさなければなりません。
/DSF 修飾子の使い方については,『OpenVMS Linker Utility Manual』を参照してください。
5.2 モジュールの設定と取り消し
デバッガが,指定されたシンボル(たとえば,変数名 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 節 を参照)。
5.3.2.1 パス名の単純化
パス名は長くなることがあります。ユーザは,次の 3 つの方法でパス名の指定を単純化できます。
パス名を簡略化するには,ネストされたプログラム単位を左から順番に削除して,一意にシンボルを指定するのに十分なパス名だけを残します。たとえば,第 5.3.2 項 の最初の例では,ROUT3\COUNT は有効な簡略化されたパス名です。
パス名のシンボルを定義するには,DEFINE コマンドを使用します。次に例を示します。
DBG> DEFINE INTX = INT_STACK\CHECK\X DBG> EXAMINE INTX |
新しい検索有効範囲を設定するには,SET SCOPE コマンドを使用します。このコマンドについては,第 5.3.3 項 を参照してください。
前へ | 次へ | 目次 | 索引 |