[ 前のページ ] [ 次のページ ] [ 目次 ] [ 索引 ] [ DOC Home ]

# 5 プログラム内シンボルへのアクセス制御

シンボリック・デバッグでは，ソース・コード内に現れるとおりに，変数名， ルーチン名などを指定できます。ユーザは，プログラム記憶位置を参照する場合， 数値メモリ・アドレスやレジスタを使用する必要はありません。

さらにユーザは，プログラムとそのソース言語に適切なコンテキストでシンボルを使用できます。 デバッガは，要素の有効範囲と可視性，データ型， 式などについて，使用している言語の規則をサポートします。

プログラムに対応するすべてのシンボルにアクセスするためには，/DEBUG コマンド修飾子を使用してそのプログラムをコンパイルおよびリンクしなければなりません。

これらの条件のもとでは，シンボル情報がソース・プログラムからデバッガに渡され処理される方法は， ほとんどの場合ユーザには見えません。しかし， 何らかの対処が必要な場合もあります。

たとえば，COUNTERという名前のルーチンにブレークポイントを設定しようとすると， 次の診断メッセージが表示されます。

         DBG> SET BREAK COUNTER
         %DEBUG-E-NOSYMBOL, symbol 'COUNTER' is not in the symbol table
         DBG>

このような場合，第5.2節で説明するように， COUTNTERが定義されているモジュールを設定しなければなりません。

シンボルXが，2つ以上のモジュール，ルーチン，または他のプログラム単位内で定義( 宣言)されている場合は，次のメッセージが表示されます。

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

このような場合，第5.3節で説明するように， シンボルのパス名を指定することによってシンボルのあいまいさを解消しなければなりません。

本章では，プログラム内シンボルのアクセスに関連する，上記およびその他の状況に対処する方法について説明します。

本章で説明するシンボル(通常は，アドレス式)は，ソース・プログラム内に存在するものだけです。

- ソース・コード内で宣言された要素(変数，ルーチン，ラベル， 配列要素，およびレコード構成要素など)の名前。

- ユーザ・プログラムとリンクされた共用可能イメージおよびモジュール( コンパイル単位)の名前。

- デバッガがソース・コードを識別するために使用する要素。たとえば， ソース・ファイルの仕様，およびリスト・ファイル内やソース・ コード表示時のソース行番号など。

次のシンボルについては別の章で説明します。

- デバッグ・セッション中にユーザがDEFINEコマンドを使用して作成したシンボルについては， 第13.4節で説明します。

- ピリオド(.)や%PCなどの組み込みシンボルについては，本書を通して適切な箇所で説明します。 また，付録 B にその定義があります。

また，シンボリック・アドレス式に対応するメモリ・アドレスやレジスタ名を取得したり， 逆にプログラム記憶位置をシンボル化する方法についての詳しい説明は， 第4.1.11項を参照してください。

注意
  プログラムがコンパイル時に最適化されている場合， プログラム内の特定の変数がコンパイラによって除去されることがあります。 このような変数を参照しようとすると， デバッガは警告を発行します(第1.2節および 第14.1節を参照)。

  非静的変数(スタックローカル変数またはレジスタ変数) を参照する前には，その変数を定義しているルーチンが呼び出しスタック上でアクティブでなければなりません。 すなわち，プログラムの実行が，非静的変数を定義しているルーチン内で停止していなければなりません( 第3.4.3 項を参照)。

# 5.1 コンパイル時およびリンク時のシンボル情報制御

シンボリック・デバッグの機能を最大限に利用するためには，第1.2節で説明したように，/DEBUG 修飾子を使用してプログラムをコンパイルおよびリンクする必要があります。

次の各項では，コンパイル時およびリンク時に，シンボル情報がどのように作成され， デバッガに渡されるのかを説明します。

## 5.1.1 コンパイル

/DEBUG修飾子を使用してソース・ファイルをコンパイルすると，コンパイラは， デバッグ・シンボル・テーブル用のシンボル・レコード(DSTレコード) を作成し，作成中のオブジェクト・モジュールにそれらを取り込みます。

DSTレコードは，シンボル名だけでなく，次に示すようにその使用法に関連するすべての情報を提供します。

- データ型，範囲，制約，および変数の有効範囲

- 関数およびプロシージャのパラメータ名とパラメータ・タイプ

- ソース行相関関係レコード(ソース行を行番号とソース・ファイルに対応づける)

ほとんどのコンパイラでは，異なるオプションを/DEBUG修飾子とともに指定すると， オブジェクト・モジュールに取り込むDST情報の量を調整することができます。 表 5-1に，ほとんどのコンパイラのオプションを示します。 詳しい説明は，コンパイラ付属のドキュメントを参照してください。

### 表 5-1 DSTシンボル情報用のコンパイラ・オプション

コンパイラ・コマンド修飾子 | オブジェクト・ モジュール内のDST情報
--- | ---
/DEBUG[1] | すべての情報
/DEBUG=TRACEBACK[2] | トレースバック情報のみ( モジュール 名，ルーチン名，行番号)
/NODEBUG[3] | 情報なし
[1] /DEBUG，/DEBUG=ALL，および/DEBUG=(SYMBOLS,TRACEBACK)は等価です。 [2] /DEBUG=TRACEBACKおよびDEBUG=(NOSYMBOLS,TRACEBACK)は等価です。 [3] /NODEBUG，/DEBUG=NONE，および/DEBUG=(NOSYMBOLS,NOTRACEBAC K) は等価です。

ほとんどのコンパイラの省略時の設定はTRACEBACKオプションです。 すなわち，/DEBUG修飾子を省略すると，ほとんどのコンパイラは， /DEBUG=TRACEBACKが指定されたものとみなします。TRACEBACKオプションを使用すると， 実行時エラー発生時にシンボリック・トレースバックを出力できるように， トレースバック条件ハンドラがメモリ・アドレスをルーチン名と行番号に変換します。 次に例を示します。

         $ RUN FORMS
            .
            .
            .
         %PAS-F-ERRACCFIL, error in accessing file PAS$OUTPUT
         %PAS-F-ERROPECRE, error opening/creating file
         %RMS-F-FNM, error in file name
         %TRACE-F-TRACEBACK, symbolic stack dump follows

         module name     routine name     line      rel PC      abs PC

         PAS$IO_BASIC    _PAS$CODE                 00000192    00001CED
         PAS$IO_BASIC    _PAS$CODE                 0000054D    000020A8
         PAS$IO_BASIC    _PAS$CODE                 0000028B    00001DE6
         FORMS           FORMS             59      00000020    000005A1
         $

トレースバック情報は，デバッガのSHOW CALLSコマンドによっても使用されます。

## 5.1.2 ローカル・シンボルとグローバル・ シンボル

DSTレコードは，プログラム内で定義されているすべてのシンボルに関する情報を含んでいます。 これらのシンボルはローカル・シンボルかグローバル・ シンボルのどちらかです。

通常，ローカル・シンボルとは，それが定義されているモジュール内でのみ参照されるシンボルを意味します。 一方グローバル・ シンボルとは，あるモジュール内で定義されていますが，別のモジュールから参照されるシンボルを意味します。 ルーチン名，プロシージャ・ エントリ・ポイント，またはグローバル・データ名などがグローバル・ シンボルです。

ある共用可能イメージ内で定義され，別のイメージから参照されるグローバル・ シンボル(プログラムの実行可能メイン・イメージなど)をユニバーサル・ シンボルと呼びます。共用可能イメージを作成する場合， リンク時にすべてのユニバーサル・シンボルを明示的に定義しなければなりません。 ユニバーサル・シンボルと共用可能イメージについての詳しい説明は 第5.4節を参照してください。

通常，コンパイラがローカル・シンボルへの参照を解決し，リンカがグローバル・ シンボルへの参照を解決します。

ローカル・シンボルとグローバル・シンボルとの違いについては，シンボル検索および共用可能イメージとユニバーサル・ シンボルとの関連で，本章の各箇所で説明します。

## 5.1.3 リンク

ユーザがLINK/DEBUGコマンドを入力し，オブジェクト・モジュールをリンクして実行可能なイメージを作成する場合， リンカはデバッグに影響を与えるいくつかの機能を実行します。

- リンク中のオブジェクト・モジュールに含まれているDSTレコードから， デバッグ・シンボル・テーブル(DST)を作成する。DSTは， デバッグ・セッション中のシンボル情報のおもなソースである。

- グローバル・シンボルへの参照を解決して，グローバル・シンボル・ テーブル(GST)を作成する。GSTは，すでにDST内に含まれているグローバル・ シンボル情報のいくつかをコピーしたものである。GST は，デバッグ時の特定の条件下ではシンボル検索に使用される。

- DSTとGSTを実行可能なイメージ内に取り込む。

- 実行可能なイメージ内にフラグを設定し，ユーザがDCLコマンドRUN を入力したときに，イメージ・アクティベータがデバッガに制御を渡すようにする( 第1.2節を参照)。

第5.4節では，共用可能イメージをデバッグ用にリンクする方法を， ユニバーサル・シンボル(共用可能イメージ内に定義され， 別のイメージから参照されるグローバル・シンボル)の定義方法といっしょに説明します。

表 5-2には，デバッガに渡されるDST情報およびGST 情報のレベルをコンパイラまたはLINKコマンド・オプション別にまとめてあります。 コンパイラ・コマンド修飾子は，リンカに渡されるDST 情報のレベルを制御します。LINKコマンド修飾子は，デバッガに渡されるDST 情報とGST情報の量だけでなく，プログラムをデバッガの制御下に置くことができるかどうかも制御します( 第1.2 節を参照)。

### 表 5-2 DSTおよびGSTのシンボル情報に与えるコンパイラとリンカの影響

コンパイラ・ コマンド修飾子 [1] | オブジェクト・ モジュール内のDST データ | LINK コマンド修飾子 [2] | デバッガに渡されるDST データ | デバッガに渡されるGST データ[3]
--- | --- | --- | --- | ---
/DEBUG | すべての情報 | /DEBUG | すべての情報 | すべての情報
/DEBUG=TRACE | トレースバック情報のみ | /DEBUG | トレースバック情報のみ | すべての情報
/NODEBUG | 情報なし | /DEBUG | 情報なし | すべての情報
/DEBUG | すべての情報 | /DSF[6] | すべての情報 | すべての情報[7]
/DEBUG=TRACE | トレースバック情報のみ | /DSF[6] | トレースバック情報のみ | すべての情報[7]
/NODEBUG | 情報なし | /DSF[6] | 情報なし | すべての情報[7]
/DEBUG | すべての情報 | /TRACE[4] | トレースバック情報のみ | すべての情報
/DEBUG=TRACE | トレースバック情報のみ | /TRACE | トレースバック情報のみ | すべての情報
/NODEBUG | 情報なし | /TRACE | 情報なし | すべての情報
/DEBUG | すべての情報 | /NOTRACE[5] |  |
[1]詳しい説明は，表 5-1を参照してください。 [2]共用可能イメージを作成する場合は，/SHAREABLE修飾子も指定する必要があります( 第5.4節を参照)。 [3] GSTデータには，リンク時に解決されるグローバル・シンボル情報が含まれています。 実行可能なイメージのGSTデータには，グローバル・ ルーチンおよびグローバル定数の名前と値が含まれます。 共用可能イメージのGSTデータには，ユニバーサル・シンボルが含まれます( 第5.1.2項および第5.4節を参照)。 [4] LINK/TRACEBACKとLINK/NODEBUGは等価です。これはLINKコマンドの省略時の設定です。 [5] RUN/DEBUGコマンドを使用すれば，デバッガを起動できますが，LINK/NOTRACEBACK コマンドを使用してリンクした場合は，シンボリック・ デバッグは実行できません。 [6] Alphaのみ。 [7] DBG$IMAGE_DSF_PATHは.DSFファイルがあるディレクトリを指していなければなりません。

コンパイラ・コマンドに/NODEBUG修飾子を指定し，その後イメージをリンクし実行すると， デバッガは，プログラムがデバッガの制御下に置かれたときに次のようなメッセージを発行します。

         %DEBUG-I-NOLOCALS, image does not contain local symbols

上記のメッセージは，/TRACEBACK修飾子または/DEBUG修飾子のどちらを使用してリンクした場合にも発行され， リンクされたイメージのDSTが作成されなかったことを意味します。 この場合，GST内に含まれるグローバル・ シンボルだけが使用可能となります。

LINKコマンドに/DEBUG修飾子を指定しないと，デバッガは，プログラムがデバッガの制御下に置かれたときに次のようなメッセージを発行します。

         %DEBUG-I-NOGLOBALS, some or all global symbols not accessible

上記のメッセージは，デバッグ・セッション中に使用可能なグローバル・ シンボル情報は，DST内に格納されています。

これらの概念については，次の各節で説明します。特に，共用可能イメージのデバッグについての詳しい説明は， 第5.4 節を参照してください。

## 5.1.4 デバッグ済みイメージ内のシンボル情報制御

シンボル・レコードは，実行可能なイメージ内で領域を占有します。プログラムのデバッグ終了後， 実行可能なイメージを小さくするために， /DEBUG修飾子を使用しないで再度リンクする場合があります。この場合， DST (トレースバック・データのみ)およびGSTを含むイメージが作成されます。

LINK/NOTRACEBACKコマンドを使用すると，デバッグの終了後，イメージ内容をユーザによる変更から保護することができます。 このコマンドは， 特権を使用してインストールする必要のあるイメージに使用します。( 『OpenVMSシステム管理者マニュアル』および『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

この例では，次の処理が実行されます。

1. TESTPROGRAM.Cをコンパイルする。

2. TESTPROGRAM.EXEとTESTPROGRAM.DSFを作成する。

3. 論理名DBG$IMAGE_DSF_PATHをカレント・ディレクトリとして定義する。

4. 保持デバッガでデバッガを起動する。

このプローシージャを使用すると，これまでより小さい実行可能ファイルを作成し， しかもデバッグのためにグローバル・シンボル情報を使用できます。 インストール済み常駐ファイルなど，特定のアプリケーションでは， 実行可能ファイルにシンボル・テーブルを格納できません。さらに，.DSF ファイルを使用すると，シンボル・テーブルを含まない実行可能ファイルを顧客に配布することができ， しかも将来デバッグが必要になったときのために， 別に.DSFファイルを保存しておくことができます。

注意
  デバッグを簡単にするために， プログラムをコンパイルするときは，/NOOPTIMIZE修飾子を使用してください( 可能な場合)。最適化されたコードのデバッグについては，第14.1節を参照してください。

別にシンボル(.DSF)ファイルが作成された実行可能ファイルをデバッグするには， 次の条件を満たさなければなりません。

- .DSFファイルの名前は，デバッグする.EXEファイルの名前と同じでなければならない。

- DBG$PROCESSがDEFAULTまたはMULTIPROCESSとして定義されている構成で実行しなければならない。

- .DSFファイルを格納するディレクトリを指すように， DBG$IMAGE_DSF_PATHを定義しなければならない。

/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項を参照してください。

### 5.3.2.2 呼び出しスタック上ルーチン内のシンボルの指定

ユーザは，数値パス名を使用して，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コマンドの説明を参照してください。 このコマンドを使用すれば，省略時の有効範囲検索リストの参照を呼び出しスタックの相対位置に再設定できます。

### 5.3.2.3 グローバル・シンボルの指定

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

         DBG> EXAMINE \X

### 5.3.2.4 ルーチンの起動の指定

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

ユーザは，パス名の中に起動番号を含めて，そのルーチンに対する特定の呼び出しを示すことができます。 起動番号は，パス名の一番右側のルーチン名の後ろに非負の整数として置かなければなりません。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 コマンドを使用します。

# 5.4 共用可能イメージのデバッグ

省略時の設定では，ユーザ・プログラムは，弊社が提供しているいくつかの共用可能イメージ( たとえば，実行時ライブラリ・イメージLIBRTL.EXE など)とリンクされる場合があります。この節では，ユーザ定義の共用可能イメージをデバッグするときに， 前に説明した概念をどのように拡張するかについて説明します。

共用可能イメージは，直接実行することを意図したものではありません。 共用可能イメージは最初に，実行可能なイメージのリンク時の入力として指定しなければなりません。 リンクされた共用可能イメージは，実行可能なイメージの実行時にロードされます。 共用可能イメージをデバッグするために， それをインストールする必要はありません。代わりに，論理名を割り当てることによって， プライベート・コピーをデバッグすることができます。

共用可能イメージのリンクについての詳しい説明は，『OpenVMS Linker Utility Manual』を参照してください。

## 5.4.1 共用可能イメージをデバッグするためのコンパイルとリンク

共用可能イメージをデバッグするためのコンパイル作業およびリンク作業の基本的な手順は， 次のとおりです。

1. /DEBUG修飾子を使用して，メイン・イメージと共用可能イメージのソース・ ファイルをコンパイルする。

2. /SHAREABLEコマンド修飾子および/DEBUGコマンド修飾子を使用して共用可能イメージをリンクする。 そのとき，そのイメージのユニバーサル・ シンボルを宣言する。ユニバーサル・シンボルは，ある共用可能イメージ内に定義され， 別のイメージから参照されるグローバル・ シンボルである。

3. メイン・イメージに対して共用可能イメージをリンクする。 そのとき，リンカ・オプションに/SHAREABLEファイル修飾子を使用して， 共用可能イメージを指定する。/DEBUGコマンド修飾子も指定する。

4. 共用可能イメージのローカル・コピーを指す論理名を定義する。 このとき，イメージ名だけでなく装置名およびディレクトリ名も指定しなければならない。 そうしないと，イメージ・アクティベータは， システムの省略時の共用可能イメージ・ライブラリ・ディレクトリであるSYS$SHARE 内からその名前のイメージを検索する。

5. メイン・イメージをデバッガの制御下に置く。共用可能イメージは実行時にロードされる。

これらの手順を次の例に示します。この例では，MAIN.FORとSUB1.FORが， 実行可能なメイン・イメージのソース・ファイルです。また，SHR1.FORとSHR2.FOR が，デバッグされる共用可能イメージのソース・ファイルです。

第5.1節で説明したように， 各イメージのソース・ ファイルをコンパイルします。

         $ FORTRAN/NOOPT/DEBUG MAIN,SUB1
         $ FORTRAN/NOOPT/DEBUG SHR1,SHR2

VAXプロセッサでは，LINKコマンドにUNIVERSAL リンカ・オプションを使用して，共用可能イメージを作成しユニバーサル・ シンボルを指定します。次に例を示します。

         $ LINK/SHAREABLE/DEBUG SHR1,SHR2,SYS$INPUT:/OPTIONS
           UNIVERSAL=SHR_ROUT <Ctrl/Z>

Alphaプロセッサでは，LINKコマンドにシンボル・ベクタ・オプションを使用して， 共用可能イメージを作成しユニバーサル・シンボルを指定します。 次に例を示します。

         $ LINK/SHAREABLE/DEBUG SHR1,SHR2,SYS$INPUT:/OPTIONS
         SYMBOL_VECTOR=(SHR_ROUT=PROCEDURE) <Ctrl/Z>

上記のコマンド例の意味は，次のとおりです。

- /SHAREABLEコマンド修飾子は，オブジェクト・ファイルSHR1.OBJ とSHR2.OBJから共用可能イメージSHR1.EXEを作成する。

- SYS$INPUT:の後ろの/OPTIONS修飾子によって，ユニバーサル・ シンボルSHR_ROUTが指定可能になる。

- /DEBUG修飾子は，SHR1.EXEのデバッグ・シンボル・テーブル(DST) とグローバル・シンボル・テーブル(GST)を作成し，それらをイメージ内に取り込む。GST には，ユニバーサル・シンボルSHR_ROUTが含まれる。

これで，共用可能イメージSHR1.EXEが現在の省略時のディレクトリに作成されます。SHR1.EXE は共用可能イメージなので，ユーザが明示的に実行することはありません。 代わりに，実行可能なメイン・イメージとリンクします。

         $ LINK/DEBUG MAIN,SUB1,SYS$INPUT:/OPTIONS
         SHR1.EXE/SHAREABLE <Ctrl/Z>
         $

上記のコマンド例の意味は，次のとおりです。

- LINKコマンドは，MAIN.OBJとSUB1.OBJから実行可能なイメージMAIN.EXE を作成する。

- /DEBUG修飾子は，MAIN.EXEのDSTとGSTを作成し，それらをイメージ内に取り込む。

- SHR1.EXEの後ろの/SHAREABLE修飾子は，SHR1.EXEがMAIN.EXEの共用可能イメージとしてリンクされることを意味する。

作成されたメイン・イメージMAIN.EXEを実行すると，リンクされたすべての共用可能イメージが， 実行時にロードされます。しかし省略時の設定では， イメージ・アクティベータは，システムの省略時の共用可能イメージ・ ライブラリ・ディレクトリであるSYS$SHARE内から共用可能イメージを検索します。 したがって，ユーザは，論理名SHR1を定義して，それが現在の省略時のディレクトリ内に存在するSHR1.EXE を指すようにしなければなりません。 このとき，必ず装置およびディレクトリを指定してください。

         $ DEFINE SHR1 SYS$DISK:[]SHR1.EXE

これで，デバッガのRUNコマンドにMAINを指定することによって，デバッガ起動後にMAIN とSHR1をデバッガの制御下に置くことができます。

         $ DEBUG/KEEP

                    Debugger Banner and Version Number

         DBG> RUN MAIN

## 5.4.2 共用可能イメージ内のシンボルへのアクセス

第5.1節，第5.2 節，および第5.3節で説明したすべての概念は， 単一イメージのモジュール，すなわち実行可能なメイン・イメージに適用されます。 ここでは，共用可能イメージのデバッグに固有の追加情報を提供します。

第5.4.1項で説明したように， デバッグ用に共用可能イメージをリンクすると， リンカは各イメージにDSTとGSTを作成します。 共用可能イメージのGSTには，ユニバーサル・シンボルだけが含まれます。 メモリを節約するために，デバッガはイメージが設定されたときだけ， そのイメージのRSTを作成します。イメージは，動的に，またはSET IMAGE コマンドの入力によって設定されます。

SHOW IMAGEコマンドは，ユーザ・プログラムにリンクされているすべての共用可能イメージを示し， 設定されているイメージや現在のイメージを識別します( 現在のイメージの定義については，第5.4.2.2項を参照)。 プログラムがデバッガの制御下に置かれたときには， 最初にメイン・イメージだけが設定されます。

次の各項では，デバッガが，プログラムの実行中に動的にイメージを設定する方法と， 実行に関係なく任意のイメージ内のシンボルへのアクセスを可能にする方法を説明します。

インストールされた書き込み可能な共用可能イメージ内にウォッチポイントを設定する方法については， 第3.4.3.4 項を参照してください。

### 5.4.2.1 PC範囲内のシンボルへのアクセス( 動的モード)

省略時の設定では，動的モードが有効になっています。したがって，実行が中断したときにはいつも， 停止している位置のイメージおよびモジュールが設定されます( それらのモジュールがまだ設定されていない場合)。

動的モードを使用すれば，次のようなシンボルへのアクセスが自動的に可能となります。

- 実行が停止しているイメージ内のすべての設定されているモジュールで定義されているシンボルの参照

- そのイメージのGST内の任意のユニバーサル・シンボルの参照

SET MODULEコマンドを使用して，そのイメージ内の他のモジュールを設定すると， ユーザはそのイメージ内の任意のシンボルを参照することができます。

いったん設定されたイメージは，CANCEL IMAGEコマンドによって取り消されるまで， そのまま設定されています。設定されたイメージおよびモジュールの数が増えたため， デバッガの処理速度が低下する場合は， CANCEL IMAGEコマンドを使用してイメージを取り消します。また，SET MODE NODYNAMICコマンドを使用して，動的モードを無効にすることもできます。

### 5.4.2.2 任意のイメージ内のシンボルへのアクセス

ユーザまたはデバッガが最後に設定したイメージを現在のイメージ と言います。現在のイメージは，シンボル検索のためのデバッグ・ コンテキストです。したがって，次のコマンドを使用した場合，ユーザは現在のイメージ内に定義されているシンボルだけを参照することができます。
DEFINE/ADDRESS
DEFINE/VALUE
DEPOSIT
EVALUATE
EXAMINE
TYPE
(SET,CANCEL) BREAK
(SET,SHOW,CANCEL) MODULE
(SET,CANCEL) TRACE
(SET,CANCEL) WATCH
SHOW SYMBOL

SHOW BREAK，SHOW TRACE，SHOW WATCHの各コマンドは，すべてのイメージ内に設定されている任意のブレークポイント， トレースポイント，またはウォッチポイントを示すことに注意してください。

現在のイメージ以外のイメージ内に存在するシンボルを参照するには， SET IMAGEコマンドを使用して現在のイメージを指定したあと，SET MODULEコマンドを使用して，そのシンボルが定義されているモジュールを設定します。SET IMAGE コマンドは，モジュールを設定しません。次のサンプル・ プログラムは，これらの概念を示したものです。

サンプル・プログラムは，メイン・イメージPROG1と共用可能イメージSHR1 からなります。現在，プログラムがデバッガの制御下に置かれ，実行がイメージPROG1 内のメイン・プログラム単位で停止していると想定します。 ここで，ルーチンROUT2にブレークポイントを設定したいとします。 ROUT2は，イメージSHR1内のあるモジュールで定義されています。

ROUT2にブレークポイントを設定しようとすると，デバッガは現在のイメージPROG1 内からROUT2を検索します。

         DBG> SET BREAK ROUT2
         %DEBUG-E-NOSYMBOL, symbol 'ROUT2' is not in symbol table
         DBG>

SHOW IMAGEコマンドは，イメージSHR1の設定が必要であることを示しています。

         DBG> SHOW IMAGE
          image name           set    base address    end address

         *PROG1                yes    00000200        000009FF
          SHR1                 no     00001000        00001FFF

          total images: 2           bytes allocated: 32856
         DBG> SET IMAGE SHR1

         DBG> SHOW IMAGE
          image name           set    base address    end address

          PROG1                yes    00000200        000009FF
         *SHR1                 yes    00001000        00001FFF

          total images: 2           bytes allocated: 41948
         DBG>

これで，SHR1が設定され，現在のイメージになりました。しかし，SET IMAGEコマンドはモジュールを設定しないので，ユーザはブレークポイントを設定する前に，ROUT2 が定義されているモジュールを設定しなければなりません。

         DBG> SET BREAK ROUT2
         %DEBUG-E-NOSYMBOL, symbol 'ROUT2' is not in symbol table
         DBG> SET MODULE/ALL
         DBG> SET BREAK ROUT2
         DBG> GO
         break at routine ROUT2
         10:     SUBROUTINE ROUT2(A,B)
         DBG>

イメージSHR1とそのすべてのモジュールが設定され，ROUT2でブレークポイントに到達しています。 あとは，通常の方法でデバッグすることができます。 たとえば，ルーチン内の命令のステップ実行や変数の検査などです。

いったん設定されたイメージおよびそのイメージ内のモジュールは，新しい現在のイメージが設定されても， そのまま設定されています。しかし， 任意の一時点に複数のシンボルにアクセスできるのは，それらのシンボルが現在のイメージ内に存在するときだけです。

### 5.4.2.3 実行時ライブラリおよびシステム・ イメージ内のユニバーサル・ シンボルへのアクセス

次の段落では，実行時ライブラリ，またはシンボル・テーブル情報が生成されていないその他の共用可能イメージ内のユニバーサル・ シンボル(ルーチン名など) にアクセスする方法について説明します。この方法を使用すれば， ユーザはたとえばCALLコマンドを使用して，第13.7節で説明するように実行時ライブラリまたはシステム・ サービス・ ルーチンを実行できます。

次のコマンド構文を使用してSET MODULEコマンドを入力します。

         SET MODULE SHARE$image-name

次に例を示します。

         DBG> SET MODULE SHARE$LIBRTL

デバッガは，ユーザ・プログラム内の各共用可能イメージに仮モジュールを作成します。 これらの共用可能イメージ・モジュールの名前には，接頭辞"SHARE$" が付いています。SHOW MODULE/SHAREコマンドは，現在のイメージ内のモジュールだけでなく， これらの共用可能イメージ・モジュールも示します。

SET MODULEコマンドによって，いったん共用可能イメージ・モジュールが設定されると， ユーザは，そのイメージ内のすべてのユニバーサル・シンボルにアクセスできます。 次のコマンドは，LIBRTL内のすべてのユニバーサル・ シンボルをリストします。

         DBG> SHOW SYMBOL * IN SHARE$LIBRTL
            .
            .
            .
         routine SHARE$LIBRTL\STR$APPEND
         routine SHARE$LIBRTL\STR$DIVIDE
         routine SHARE$LIBRTL\STR$ROUND
            .
            .
            .
         routine SHARE$LIBRTL\LIB$WAIT
         routine SHARE$LIBRTL\LIB$GETDVI
            .
            .
            .

ユーザは，これらのユニバーサル・シンボルを，たとえばCALLコマンドやSET BREAK コマンドなどに指定できます。

SET MODULEコマンドを使用して共用可能イメージ・モジュールを設定すると， そのイメージのユニバーサル・シンボルが実行時シンボル・テーブルにロードされます。 その結果，これらのシンボルは現在のイメージから参照できるようになります。 しかし，そのイメージ内の他のシンボル(ローカル・ シンボルやグローバル・シンボル)は，現在のイメージからは参照できません。 すなわち，ユーザのデバッグ・コンテキストは，現在のイメージに設定されたままです。

## 5.4.3 常駐イメージのデバッグ(Alpha のみ)

常駐イメージは，効率を高めることができるように特定の方法で作成され， インストールされた共用可能モジュールです。このようなイメージを作成するには， シンボル・テーブルを除いてイメージをリンクし，システム空間でイメージを実行する必要があります。 このようにして作成したイメージは， デバッグが困難になります。次の手順では，もっと簡単にデバッグできる常駐イメージを作成します。

1. 共用可能イメージをコンパイルする。次の例を参照。

            $ CC/DEBUG/NOOPTIMIZE RESIDENTMODULE.C

2. /DSF修飾子を使用して共用可能イメージをリンクする。次の例を参照。

            $ LINK/NOTRACEBACK/SHAREABLE/SECTION_BINDING/DSF RESIDENTMODULE

   イメージのリンクについては，『OpenVMS Linker Utility Manual』を参照。

3. インストール済み常駐イメージを作成する。Installユーティリティの使い方については， 『OpenVMSシステム管理ユーティリティ・リファレンス・マニュアル( 上巻)』を参照。常駐イメージの詳細については，『OpenVMSシステム管理者マニュアル( 下巻)』を参照。

4. 常駐イメージを呼び出すプログラムをコンパイルする。次の例を参照。

            $ CC/DEBUG/NOOPTIMIZE TESTPROGRAM

5. 常駐イメージを呼び出す実行可能イメージを作成する。次の例を参照。

            $ LINK/DSF TESTPROGRAM

6. 常駐イメージのプライベート・コピーを作成する。次の例を参照。

            $ COPY SYS$LIBRARY:RESIDENTMODULE.EXE []RESIDENTMODULE.EXE

7. 常駐イメージのプライベート・コピーを指す論理名を定義する。 次の例を参照。

            $ DEFINE RESIDENTMODULE []RESIDENTMODULE

8. テスト・プログラム用の.DSFファイルと常駐モジュール用の.DSF ファイルの両方が同じディレクトリに格納されていることを確認する。

9. .DSFファイルを格納したディレクトリを指すように， DBG$IMAGE_DSF_PATHを定義する。

10. デバッガを起動する。次の例を参照。

             $ DEBUG/KEEP TESTPROGRAM

    TESTPROGRAMは，DBG$PROCESSがDEFAULTまたはMULTIPROCESSとして定義されている構成で実行しなければならない。

これで実行可能イメージと常駐イメージに対して，すべてのデバッグ・オプションを使用できるようになります。

[ 前のページ ] [ 次のページ ] [ 目次 ] [ 索引 ] [ DOC Home ]