前へ | 次へ | 目次 | 索引 |
次の段落では,実行時ライブラリ,またはシンボル・テーブル情報が生成されていないその他の共用可能イメージ内のユニバーサル・シンボル(ルーチン名など)にアクセスする方法について説明します。この方法を使用すれば,ユーザはたとえば 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 |
これで実行可能イメージと常駐イメージに対して,すべてのデバッグ・オプションを使用できるようになります。
ソース・コードとは,ソース・ファイル内に現れるプログラミング言語の文を指します。ソース・コードの各行はソース行と呼ばれます。
本章には次の内容が含まれています。
本章で説明する方法は,行(非画面)モードだけでなく画面モードにも適用できます。行モードと画面モードの動作内容の相違点は,本章と各コマンドの説明の中で示します。画面モードについての詳細な説明は,第 7 章 を参照してください。
プログラムがコンパイラによって最適化されている場合は,デバッグ時に実行されるコードがソース・コードに一致しないこともあります。詳しい説明は,第 14.1 節 を参照してください。
6.1 デバッガがソース・コード情報を取得する方法
コンパイラは,オブジェクト・モジュールを生成するためにソース・ファイルを処理する場合,各ソース行に順に行番号を割り当てます。ほとんどの言語の場合,各コンパイル単位(モジュール)は行1から始まります。Adaなどでは各ソース・ファイルが行1から始まり,1 つのソース・ファイルが複数のコンパイル単位を表す場合もあります。
行番号は /LIST コンパイル・コマンド修飾子を使用して取得したソース・リスト内に表示されます。また,デバッガがソース・コードを表示する際に,行モードと画面モードのどちらの場合でも常に行番号が表示されます。さらに,いくつかのデバッガ・コマンド(たとえば,TYPE および SET BREAK)で行番号を指定することができます。
コンパイル・コマンドと LINK コマンドの両方に /DEBUG コマンドを指定した場合にだけ,デバッグ時にソース行は表示されます。そのような条件下では,コンパイラによって作成されてデバッグ・シンボル・テーブル(DST)に渡されたシンボル情報には,ソース行コリレーション・レコードが含まれます。ある特定のモジュールでは,ソース行コリレーション・レコードには,そのモジュールを支える各ソース・ファイルの完全なファイル指定が入っています。また,ソース行コリレーション・レコードはソース・レコード(シンボルや型など)をモジュール内のソース・ファイルと行番号に対応づけます。
6.2 ソース・ファイルの記憶位置の指定
デバッグ・シンボル・テーブル(DST)には,各ソース・ファイルのコンパイル時における完全なファイル指定が入っています。したがって,省略時の設定では,デバッガはソース・ファイルがコンパイル時と同じディレクトリの中に入っているものと想定します。ソース・ファイルをコンパイル後に別のディレクトリに移動した場合,デバッガはそれを見つけることができず,そのファイルからソース・コードを表示しようとすると次のような警告を表示します。
%DEBUG-W-UNAOPNSRC, unable to open source file DISK:[JONES.WORK]PRG.FOR;2 |
このような場合,デバッガに新しいディレクトリを指示するため,SET SOURCE コマンドを使用します。このコマンドは,そのプログラム用のすべてのソース・ファイルに対して適用したり,特定のモジュール用のソース・ファイルだけに適用したりできます。
たとえば,次のコマンド行を入力すると,デバッガは WORK$:[JONES.PROG3]: の中からすべてのソース・ファイルを探します。
DBG> SET SOURCE WORK$:[JONES.PROG3] |
ディレクトリ検索リストを SET SOURCE コマンドで指定できます。たとえば,次のコマンド行を入力すると,デバッガはまず現在の省略時ディレクトリ([])からファイルを探し,次に WORK$:[JONES.PROG3]: を探します。
DBG> SET SOURCE [], WORK$:[JONES.PROG3] |
ある特定のモジュール用のソース・ファイルだけに SET SOURCE コマンドを適用したい場合は,/MODULE=module-name 修飾子を使用してそのモジュールを指定します。たとえば,次のコマンド行は,モジュール SCREEN_IO 用のソース・ファイルがディレクトリ DISK2:[SMITH.SHARE] に入っていることを指定します。他のモジュール用のソース・ファイルの検索は,このコマンドによって影響を受けません。
DBG> SET SOURCE/MODULE=SCREEN_IO DISK2:[SMITH.SHARE] |
つまり,SET SOURCE/MODULE コマンドは特定のモジュール用のソース・ファイルの記憶位置を指定し,SET SOURCE コマンドは SET SOURCE/MODULE コマンド内で明示的に指定されなかったモジュール用のソース・ファイルの記憶位置を指定します。
SET SOURCE コマンドを入力する場合,/LATEST か /EXACT の修飾子が常に有効であることを確認してください。/LATEST は,最新バージョン(ディレクトリ内にある最大番号のバージョン)のソース・ファイルを検索するようデバッガに指示します。/EXACT 修飾子は,最後にコンパイルしたバージョン(コンパイル時に作成されたデバッガ・シンボル・テーブルに記録されているバージョン)を検索するようデバッガに指示します。たとえば,SET SOURCE/LATEST コマンドは SORT.FOR;3 を検索し,SET SOURCE/EXACT は SORT.FOR;1 を検索するという具合です。
SHOW SOURCE コマンドは,現在有効なすべてのソース・ディレクトリ検索リストを表示するために使用します。このコマンドは 1 つまたは複数の SET SOURCE/MODULE コマンドで前に設定したとおりの特定のモジュール用の検索リストを表示し,SET SOURCE コマンドで前に設定したとおりの他のすべてのモジュール用の検索リストを表示します。次に例を示します。
DBG> SET SOURCE [PROJA],[PROJB],USER$:[PETER.PROJC] DBG> SET SOURCE/MODULE=COBOLTEST [], DISK$2:[PROJD] DBG> SHOW SOURCE source directory search list for COBOLTEST: [] DISK$2:[PROJD] source directory search list for all other modules: [PROJA] [PROJB] USER$:[PETER.PROJC] DBG> |
SET SOURCE コマンドも SET SOURCE/MODULE コマンドも入力しなかった場合,SHOW SOURCE コマンドは現在有効な検索リストがないことを示します。
前の SET SOURCE コマンドの効力を取り消すには,CANCEL SOURCE コマンドを使用します。前の SET SOURCE/MODULE コマンドの効力を取り消すには,CANCEL SOURCE/MODULE コマンドを同じモジュール名を指定して使用します。
ソース・ディレクトリ検索リストを取り消した場合,デバッガは再び,指定されたモジュールに対応するソース・ファイルがコンパイル時と同じディレクトリに入っているものと想定します。
コンパイル後に別のディレクトリに移されたソース・ファイルをデバッガが検索する方法についての詳しい説明は,SET SOURCE コマンドの説明を参照してください。
6.3 行番号の指定によるソース・コードの表示
TYPE コマンドを使用すると,コンパイラ割り当て行番号を指定することによってソース行を表示できます。その場合,それぞれの行番号はソース・コードの1行を指定します。
たとえば,次のコマンドはデバッグ中のモジュールの行 160 と行 22〜24 を表示します。
DBG> TYPE 160, 22:24 module COBOLTEST 160: START-IT-PARA. module COBOLTEST 22: 02 SC2V2 PIC S99V99 COMP VALUE 22.33. 23: 02 SC2V2N PIC S99V99 COMP VALUE -22.33. 24: 02 CPP2 PIC PP99 COMP VALUE 0.0012. DBG> |
あるモジュールのすべてのソース行を表示するには,1 から始めてそのモジュール内の最大の行番号またはそれ以上の数で終わる行番号の範囲を指定します。
ソース行の表示後は,行番号なしの TYPE コマンドを入力すれば,つまり TYPE コマンドを入力してから Return キーを押せば,そのモジュール内の次の行を表示できます。次に例を示します。
DBG> TYPE 160 module COBOLTEST 160: START-IT-PARA. DBG> TYPE module COBOLTEST 161: MOVE SC1 TO ES0. DBG> |
その後,繰り返し TYPE コマンドを入力することによって,その次の行とそれ以降の行を表示できます。このようにして,一度に 1 行ずつコードを参照することができます。
プログラム内の任意のモジュールのソース行を表示するには,行番号といっしょにモジュール名を指定します。パス名の表記法は標準のものを使用します。つまり,最初にモジュール名を指定し,次にバックスラッシュ(\),最後に行番号または行番号の範囲を指定しますが,それらの間にスペースは入れません。たとえば,次のコマンドは TEST というモジュールの行 16 を表示します。
DBG> TYPE TEST\16 |
TYPE コマンドでモジュール名を指定する場合,そのモジュールは設定されていなければなりません。特定のモジュールが設定されているかどうかを判別するには,SHOW MODULE コマンドを使用します。その後,必要であれば SET MODULE コマンドを使用してください(第 5.2 節 を参照)。
TYPE コマンドでモジュール名を指定しなかった場合,デバッガは省略時の設定では現在実行が一時停止されているモジュール,つまり,PC 範囲に対応したモジュールのソース行を表示します。SET SCOPE コマンドで別の有効範囲を指定してある場合は,デバッガは指定された有効範囲に対応するモジュールのソース行を表示します。
画面モードでは,TYPEコマンドの出力は現在のソースの表示を更新します(第 7.2.6 項 を参照)。
プログラム内のさまざまな記憶位置のソース行を表示したあと,KP5 を押すと,現在実行が一時停止されている行を再表示することができます。
6.4 コード・アドレス式の指定によるソース・コードの表示
EXAMINE/SOURCEコマンドを使用すると,コード・アドレス式に対応したソース行を表示できます。コード・アドレス式は機械語コード命令のアドレスを表すものなので,次のいずれかでなければなりません。
EXAMINE/SOURCE コマンドに変数名を指定することはできません。変数名は,命令ではなくデータに対応しているからです。
EXAMINE/SOURCE コマンドを使用した場合,デバッガはメモリ・アドレスを取得するためにアドレス式を評価し,どのコンパイラ割り当て行番号がそのアドレスに対応するかを判別してから,その行番号によって指定されるソース行を表示します。
たとえば,次のコマンド行はルーチン SWAP のアドレス(宣言)に対応したソース行を表示します。
DBG> EXAMINE/SOURCE SWAP module MAIN 47: procedure SWAP(X,Y: in out INTEGER)is DBG> |
命令に対応しない行番号を指定した場合,デバッガは診断メッセージを発行します。次に例を示します。
DBG> EXAMINE/SOURCE %LINE 6 %DEBUG-I-LINEINFO, no line 6, previous line is 5, next line is 8 %DEBUG-E-NOSYMBOL, symbol '%LINE 6' is not in the symbol table DBG> |
EXAMINE/SOURCE コマンドをシンボリック・アドレス式(行番号,ラベル,またはルーチン)といっしょに使用する際,その要素を定義しているモジュールがまだ設定されていないときには,それを設定しなければならない場合もあります。特定のモジュールが設定されているかどうかを判別するには,SHOW MODULE コマンドを使用します。その後,必要であれば SET MODULE コマンドを使用します(第 5.2 節 を参照)。
EXAMINE/SOURCE .%PC コマンドは,現在の PC 値(実行されようとしている行)に対応するソース行を表示します。次に例を示します。
DBG> EXAMINE/SOURCE .%PC module COBOLTEST 162: DISPLAY ES0. DBG> |
内容演算子(.)の使用に注意してください。この演算子は,このピリオドの後ろにある要素の内容を指定します。内容演算子を使用しなかった場合,デバッガは PC 内に現在格納されているアドレスではなく,PC のソース行を見つけようとします。
DBG> EXAMINE/SOURCE %PC %DEBUG-W-NOSRCLIN, no source line for address 7FFF005C DBG> |
次の例は,数値パス名(1\)を使用して呼び出しスタックの 1 レベル下の PC 値にある実行が一時停止されているルーチンの呼び出しのソース行を表示する例です。
DBG> EXAMINE/SOURCE .1\%PC |
画面モードでは,EXAMINE/SOURCE コマンドの出力は現在のソースの表示を更新します(第 7.2.6 項 を参照)。
デバッガは,次のコンテキストで EXAMINE/SOURCE コマンドを使用して現在の PC 値のソース・コードを表示します。
キーパッド・キー 5(KP5)が次のような一連のデバッガ・コマンドにバインドされています。
EXAMINE/SOURCE .%SOURCE_SCOPE\%PC; EXAMINE/INST .%INST_SCOPE\%PC |
この一連のコマンドは,現在の有効範囲内で現在実行が一時停止されている位置のソース行と命令を表示します。KP5 を押せばデバッグ・コンテキストを素早く判別することができます。
定義済みソース・ディスプレイ「SRC」は自動的に更新される表示です。これは,デバッガが実行に割り込みをかけ,コマンドを求めるプロンプトを表示するたびに,次の組み込みコマンドを実行します(第 7.4.1 項 を参照)。
EXAMINE/SOURCE .%SOURCE_SCOPE\%PC |
前へ | 次へ | 目次 | 索引 |