日本-日本語 |
|
|
|
OpenVMS マニュアル |
|
HP OpenVMS
|
目次 | 索引 |
5.4 共用可能イメージのデバッグ |
省略時の設定では,ユーザ・プログラムは,弊社が提供しているいくつかの共用可能イメージ ( たとえば,実行時ライブラリ・イメージ LIBRTL.EXE など ) とリンクされる場合があります。この節では,ユーザ定義の共用可能イメージをデバッグするときに,前に説明した概念をどのように拡張するかについて説明します。
共用可能イメージは,直接実行することを意図したものではありません。共用可能イメージは最初に,実行可能なイメージのリンク時の入力として指定しなければなりません。リンクされた共用可能イメージは,実行可能なイメージの実行時にロードされます。共用可能イメージをデバッグするために,それをインストールする必要はありません。代わりに,論理名を割り当てることによって,プライベート・コピーをデバッグすることができます。
共用可能イメージのリンクについての詳しい説明は, 『OpenVMS Linker Utility Manual』
を参照してください。
5.4.1 共用可能イメージをデバッグするためのコンパイルとリンク
共用可能イメージをデバッグするためのコンパイル作業およびリンク作業の基本的な手順は,次のとおりです。
これらの手順を次の例に示します。この例では,MAIN.FOR と SUB1.FOR が,実行可能なメイン・イメージのソース・ファイルです。また,SHR1.FOR と SHR2.FOR が,デバッグされる共用可能イメージのソース・ファイルです。
第 5.1 節 で説明したように,各イメージのソース・ファイルをコンパイルします。
$ FORTRAN/NOOPT/DEBUG MAIN,SUB1 $ FORTRAN/NOOPT/DEBUG SHR1,SHR2 |
Alpha プロセッサでは,LINK コマンドにシンボル・ベクタ・オプションを使用して,共用可能イメージを作成しユニバーサル・シンボルを指定します。次に例を示します。
$ LINK/SHAREABLE/DEBUG SHR1,SHR2,SYS$INPUT:/OPTIONS SYMBOL_VECTOR=(SHR_ROUT=PROCEDURE) [Ctrl/Z] |
上記のコマンド例の意味は,次のとおりです。
これで,共用可能イメージ SHR1.EXE が現在の省略時のディレクトリに作成されます。SHR1.EXE は共用可能イメージなので,ユーザが明示的に実行することはありません。代わりに,実行可能なメイン・イメージとリンクします。
$ LINK/DEBUG MAIN,SUB1,SYS$INPUT:/OPTIONS SHR1.EXE/SHAREABLE [Ctrl/Z] $ |
上記のコマンド例の意味は,次のとおりです。
作成されたメイン・イメージ 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.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 範囲内のシンボルへのアクセス (動的モード)
省略時の設定では,動的モードが有効になっています。したがって,実行が中断したときにはいつも,停止している位置のイメージおよびモジュールが設定されます (それらのモジュールがまだ設定されていない場合)。
動的モードを使用すれば,次のようなシンボルへのアクセスが自動的に可能となります。
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 のみ)
$ CC/DEBUG/NOOPTIMIZE RESIDENTMODULE.C
$ LINK/NOTRACEBACK/SHAREABLE/SECTION_BINDING/DSF RESIDENTMODULE
イメージのリンクについては,『OpenVMS Linker Utility Manual』を参照。
$ CC/DEBUG/NOOPTIMIZE TESTPROGRAM
$ LINK/DSF TESTPROGRAM
$ COPY SYS$LIBRARY:RESIDENTMODULE.EXE []RESIDENTMODULE.EXE
$ DEFINE RESIDENTMODULE []RESIDENTMODULE
$ DEBUG/KEEP TESTPROGRAM
目次 | 索引 |
|