日本-日本語 |
|
|
|
OpenVMS マニュアル |
|
HP OpenVMS
|
目次 | 索引 |
シンボリック・デバッグでは,ソース・コード内に現れるとおりに,変数名,ルーチン名などを指定できます。ユーザは,プログラム記憶位置を参照する場合,数値メモリ・アドレスやレジスタを使用する必要はありません。
さらにユーザは,プログラムとそのソース言語に適切なコンテキストでシンボルを使用できます。デバッガは,要素の有効範囲と可視性,データ型,式などについて,使用している言語の規則をサポートします。
プログラムに対応するすべてのシンボルにアクセスするためには, /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 節 で説明するように,シンボルのパス名を指定することによってシンボルのあいまいさを解消しなければなりません。
本章では,プログラム内シンボルのアクセスに関連する,上記およびその他の状況に対処する方法について説明します。
本章で説明するシンボル ( 通常は,アドレス式 ) は,ソース・プログラム内に存在するものだけです。
次のシンボルについては別の章で説明します。
また,シンボリック・アドレス式に対応するメモリ・アドレスやレジスタ名を取得したり,逆にプログラム記憶位置をシンボル化する方法についての詳しい説明は, 第 4.1.11 項 を参照してください。
注意 プログラムがコンパイル時に最適化されている場合,プログラム内の特定の変数がコンパイラによって除去されることがあります。このような変数を参照しようとすると,デバッガは警告を発行します ( 第 1.2 節 および 第 14.1 節 を参照 )。 非静的変数 ( スタックローカル変数またはレジスタ変数 ) を参照する前には,その変数を定義しているルーチンが呼び出しスタック上でアクティブでなければなりません。すなわち,プログラムの実行が,非静的変数を定義しているルーチン内で停止していなければなりません ( 第 3.4.3 項 を参照 )。 |
5.1 コンパイル時およびリンク時のシンボル情報制御 |
シンボリック・デバッグの機能を最大限に利用するためには, 第 1.2 節 で説明したように,/DEBUG 修飾子を使用してプログラムをコンパイルおよびリンクする必要があります。
次の各項では,コンパイル時およびリンク時に,シンボル情報がどのように作成され,デバッガに渡されるのかを説明します。
/DEBUG 修飾子を使用してソース・ファイルをコンパイルすると,コンパイラは,デバッグ・シンボル・テーブル用のシンボル・レコード (DST レコード ) を作成し,作成中のオブジェクト・モジュールにそれらを取り込みます。
DST レコードは,シンボル名だけでなく,次に示すようにその使用法に関連するすべての情報を提供します。
ほとんどのコンパイラでは,異なるオプションを /DEBUG 修飾子とともに指定すると,オブジェクト・モジュールに取り込むDST情報の量を調整することができます。
表 5-1 に,ほとんどのコンパイラのオプションを示します。詳しい説明は,コンパイラ付属のドキュメントを参照してください。
5.1.1 コンパイル
コンパイラ・コマンド修飾子 | オブジェクト・モジュール内の DST情報 |
---|---|
/DEBUG 1 | すべての情報 |
/DEBUG=TRACEBACK 2 | トレースバック情報のみ (モジュール名,ルーチン名,行番号) |
/NODEBUG 3 | 情報なし |
ほとんどのコンパイラの省略時の設定は 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 コマンドを入力し,オブジェクト・モジュールをリンクして実行可能なイメージを作成する場合,リンカはデバッグに影響を与えるいくつかの機能を実行します。
第 5.4 節 では,共用可能イメージをデバッグ用にリンクする方法を,ユニバーサル・シンボル ( 共用可能イメージ内に定義され,別のイメージから参照されるグローバル・シンボル ) の定義方法といっしょに説明します。
表 5-2 には,デバッガに渡される DST 情報および GST 情報のレベルをコンパイラまたは LINK コマンド・オプション別にまとめてあります。コンパイラ・コマンド修飾子は,リンカに渡される DST 情報のレベルを制御します。LINK コマンド修飾子は,デバッガに渡される DST 情報と GST 情報の量だけでなく,プログラムをデバッガの制御下に置くことができるかどうかも制御します ( 第 1.2 節 を参照 )。
コンパイラ・ コマンド 修飾子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 |
コンパイラ・コマンドに /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 コマンドと使用すると,トレースバック・データを含むシンボル情報はイメージに渡されません。
Alpha システムでは,/DSF 修飾子を使用してプログラムをリンクすることにより,シンボル情報を格納した個別のファイルを作成できます。省略時の設定では,シンボル・ファイルは,LINK ユーティリティで作成される実行可能ファイルと同じファイル名であり,ファイル・タイプは .DSF です。次の例を参照してください。
5.1.5 個別のシンボル・ファイルの作成 (Alpha のみ)
$ 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』を参照してください。
目次 | 索引 |
|