日本-日本語
日本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
デバッガ説明書


目次 索引

第 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 項 を参照 )。



シンボリック・デバッグの機能を最大限に利用するためには, 第 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 4 すべての情報 すべての情報 5
/DEBUG=TRACE トレースバック情報のみ /DSF 4 トレースバック情報のみ すべての情報 5
/NODEBUG 情報なし /DSF 4 情報なし すべての情報 5
         
/DEBUG すべての情報 /TRACE 6 トレースバック情報のみ すべての情報
/DEBUG=TRACE トレースバック情報のみ /TRACE トレースバック情報のみ すべての情報
/NODEBUG 情報なし /TRACE 情報なし すべての情報
         
/DEBUG すべての情報 /NOTRACE 7    

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

コンパイラ・コマンドに /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 ファイルの名前と同じでなければならない。

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

/DSF 修飾子の使い方については,『OpenVMS Linker Utility Manual』を参照してください。


目次 索引

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