Compaq OpenVMS
デバッガ説明書


前へ 次へ 目次 索引


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] 

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

これで,共用可能イメージ 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.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 範囲内のシンボルへのアクセス(動的モード)

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

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

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 でブレークポイントに到達しています。あとは,通常の方法でデバッグすることができます。たとえば,ルーチン内の命令のステップ実行や変数の検査などです。

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


前へ 次へ 目次 索引