Compaq OpenVMS
デバッガ説明書


前へ 次へ 目次 索引


2.5.2 シンボルのあいまいさの解消

シンボルのあいまいさは,シンボル(たとえば,変数名 X)が 2 つ以上のルーチン内または他のプログラム単位内で定義されているときに起こります。

ほとんどの場合,デバッガはシンボルのあいまいさを自動的に解消します。最初に,現在設定されている言語の有効範囲および可視性規則が適用されます。さらに,デバッガは,任意のモジュール内のシンボル指定を許可しているため(ブレークポイントを設定するときなど),呼び出しスタック上の呼び出しルーチンの順序で,シンボルのあいまいさを解消します。

シンボルのあいまいさを解消できない場合,デバッガは次のようなメッセージを発行します。


DBG> EXAMINE Y
%DEBUG-W-NOUNIQUE, symbol 'Y' is not unique
DBG>

このような場合は,そのシンボルの宣言を一意に指定するために,パス名接頭識別子を使用します。最初に,SHOW SYMBOLコマンドを使用して,そのシンボルに対応する(そのシンボルのすべての宣言に対応する)すべてのパス名のうち,現在 RST にロードされているものを確認します。そして,必要なパス名接頭識別子を使用して,シンボルを参照します。次に例を示します。


DBG> SHOW SYMBOL Y
data MOD7\ROUT3\BLOCK1\Y
data MOD4\ROUT2\Y
DBG> EXAMINE MOD4\ROUT2\Y
MOD4\ROUT2\Y: 12
DBG>

Y の特定の宣言を繰り返して参照する必要がある場合は,SET SCOPE コマンドを使用して,シンボル検索用に新しい省略時の有効範囲を設定します。新しい有効範囲を設定したあと,パス名接頭識別子を指定しないで Y を参照すると,新しい有効範囲内で見える Y の宣言が使用されます。次に例を示します。


DBG> SET SCOPE MOD4\ROUT2
DBG> EXAMINE Y
MOD4\ROUT2\Y: 12
DBG>

シンボル検索用の現在の有効範囲を表示するには,SHOW SCOPE コマンドを使用します。省略時の有効範囲を復元するには,CANCEL SCOPE コマンドを使用します。

2.6 デバッギング・セッションの例

この節では,論理エラーを含む FORTRAN プログラム(例 2-1 を参照)を例に,デバッギング・セッションの概要を示します。この例には,本文の説明で参照されているソース行を識別できるよう,コンパイラ割り当て行番号が含まれています。

SQUARES という名前のこのプログラムは,次の機能を持っています。

  1. データ・ファイルから一連の整数値を読み込んで,それらを配列 INARR 内に保在する(4 行目および 5 行目)。

  2. ゼロ以外の各整数を 2 乗して,別の配列 OUTARR にコピーするループに入る(8 行目から 13 行目)。

  3. 元の整数列内のゼロ以外の要素の数とその各要素を 2 乗した値をプリントする(16 行目から 21 行目)。

例 2-1 サンプル・プログラムSQUARES

 1:       INTEGER INARR(20), OUTARR(20)
 2: C 
 3: C     ---データ・ファイルから入力用の配列を読み込む 
 4:       OPEN(UNIT=8, FILE='DATAFILE.DAT', STATUS='OLD')
 5:       READ(8,*)N,(INARR(I), I=1,N)
 6: C 
 7: C     ---すべてのゼロ以外の要素を2乗してOUTARRに格納する 
 8:       K = 0 
 9:       DO 10 I = 1, N 
10:       IF(INARR(I).NE. 0)THEN 
11:           OUTARR(K)= INARR(I)**2 
12:       ENDIF 
13:    10 CONTINUE 
14: C 
15: C     ---2乗された出力値をプリントし,終了する 
16:       PRINT 20, K 
17:    20 FORMAT(' Number of nonzero elements is',I4)
18:       DO 40 I = 1, K 
19:       PRINT 30, I, OUTARR(I)
20:    30 FORMAT(' Element',I4,' has value',I6)
21:    40 CONTINUE 
22:       END 

SQUARES を実行すると,データ・ファイル内のゼロ以外の要素の数に関係なく,次のようなメッセージが出力されます。


$ RUN SQUARES
Number of nonzero elements is   0

このプログラムのエラーは,OUTARR 内の現在のインデックス値を保持している変数 K が,9 行目から 13 行目までのループ内で増分されていないことです。11 行目の直前に K = K + 1 という文を挿入しなければなりません。

例 2-2 に,デバッギング・セッションの開始方法とデバッガを使用してエラーを発見する方法を示します。例のあとに,各番号に対応する説明があります。

例 2-2 プログラムSQUARESを使用したデバッギング・セッション例

$ FORTRAN/DEBUG/NOOPTIMIZE SQUARES   (1)
$ LINK/DEBUG SQUARES   (2)
$  DEBUG/KEEP    (3)
            Debugger Banner and Version Number 
DBG> RUN SQUARES   (4)
%DEBUG-I-INITIAL, language is FORTRAN, module set to SQUARES$MAIN
DBG> STEP 4   (5)
stepped to SQUARES$MAIN\%LINE 9
     9:         DO 10 I = 1, N
DBG> EXAMINE N,K   (6)
SQUARES$MAIN\N:       9
SQUARES$MAIN\K:       0
DBG> STEP 2   (7)
stepped to SQUARES$MAIN\%LINE 11
    11:                 OUTARR(K)= INARR(I)**2
DBG> EXAMINE I,K   (8)
SQUARES$MAIN\I:       1
SQUARES$MAIN\K:       0
DBG> DEPOSIT K = 1   (9)
DBG> SET TRACE/SILENT %LINE 11 DO(DEPOSIT K = K + 1)  (10)
DBG> GO   (11)
Number of nonzero elements is   4
Element   1 has value    16
Element   2 has value    36
Element   3 has value     9
Element   4 has value    49
%DEBUG-I-EXITSTATUS, is 'SYSTEM-S-NORMAL, normal successful completion'
DBG> SPAWN   (12)
$ EDIT SQUARES.FOR   (13)
   .
   .
   .
10:       IF(INARR(I).NE. 0)THEN
11:           K = K + 1
12:           OUTARR(K)= INARR(I)**2
13:       ENDIF
   .
   .
   .
$ FORTRAN/DEBUG/NOOPTIMIZE SQUARES   (14)
$ LINK/DEBUG SQUARES
$ LOGOUT   (15)
DBG> RUN SQUARES   (16)
%DEBUG-I-INITIAL, language is FORTRAN, module set to SQUARES$MAIN
DBG> SET BREAK %LINE 12 DO(EXAMINE I,K)  (17)
DBG> GO   (18)
SQUARES$MAIN\I:        1
SQUARES$MAIN\K:        1
DBG> GO
SQUARES$MAIN\I:        2
SQUARES$MAIN\K:        2
DBG> GO
SQUARES$MAIN\I:        4
SQUARES$MAIN\K:        3
DBG> EXIT   (19)
$ 

次の説明は,例 2-2 内の番号に対応しています。例 2-1 は,デバッグ中のプログラムを示しています。

  1. DCL FORTRAN コマンドの /DEBUG 修飾子は,プログラムのコードおよびデータに加えて,SQUARES に関連するシンボル情報をオブジェクト・モジュール SQUARES.OBJ に書き込むようコンパイラに指示します。

    /NOOPTIMIZE 修飾子は,Fortran コンパイラの最適化を禁止して,実行可能なコードとプログラムのソース・コードが一致するようにしています。最適化されたコードをデバッグすると,いくつかのプログラム記憶位置の内容とソース・コードの表示内容とが一致しないことがあるため,混乱を招きます。

  2. DCL LINK コマンドに /DEBUG 修飾子を指定すると,リンカは,SQUARES.OBJ 内に存在するすべてのシンボル情報を実行可能なイメージに含めます。

  3. DCL コマンド DEBUG/KEEP が,デバッガを起動します。起動されると,バナーとデバッガ・プロンプト DBG> が表示されます。ユーザは,デバッガ・コマンドが入力できるようになります。

  4. デバッガ・コマンド RUN SQUARES は,プログラム SQUARES をデバッガの制御下に置きます。情報メッセージは,プログラムのソース言語とメイン・プログラム単位名(この例では,それぞれ FORTRAN と SQUARES)を表示します。

    最初にメイン・プログラム単位の先頭(この例では,SQUARES の 1 行目)で実行は一時停止します。

  5. READ 文が実行され,K に 0 が代入されたあと,変数 N と K の値をテストします。

    コマンド STEP 4 によって,プログラムのソース行が 4 行実行されます。9 行目で実行は一時停止します。STEP コマンドは,実行可能なコードに変換されなかったソース行を無視することに注意してください。また,省略時の設定では,デバッガは実行が一時停止したソース行を表示します。

  6. コマンド EXAMINE N,K が,N と K の現在値を表示します。この時点では,これらは正しい値を示しています。

  7. コマンド STEP 2 によって,プログラムはループに入り,INARR のゼロ以外のすべての要素の 2 乗を OUTARR 内にコピーします。

  8. コマンド EXAMINE I,K が,I と K の現在値を表示します。

    I の値は,予想どおり 1 です。しかし,K の値は 0 になっており,予想していた値 1 ではありません。ここでエラーが発見されました。K は,ループ内の 11 行目で使用される直前に増分されなければなりません。

  9. DEPOSIT コマンドを使用して,K に正しい値 1 を代入します。

  10. ここで,SET TRACE コマンドを使用してプログラムをパッチし,K の値がループ内で自動的に増分されるようにします。このコマンドは,実行が 11 行目に到達するたびに検出されるトレースポイントを設定します。

  11. パッチをテストするために,GO コマンドで,現在の記憶位置から実行を開始します。

    プログラムの出力は,パッチされたプログラムが正しく動作したことを示します。EXITSTATUS メッセージは,プログラムが最後まで実行されたことを示します。

  12. SPAWN コマンドでサブプロセスを作成して,デバッギング・セッションを終了することなく一時的に DCL レベルに制御を戻します。ここで,ソース・ファイルを修正し,プログラムを再度コンパイルおよびリンクします。

  13. EDIT コマンドでエディタを起動し,ソース・ファイルを編集して,10 行目の後ろに K = K + 1 を挿入します。例では,明確にするために,コンパイラ割り当て行番号が付加されています。

  14. 修正されたプログラムをコンパイルおよびリンクします。

  15. 作成されたサブプロセスを LOGOUT コマンドによって終了し,デバッガに制御を戻します。

  16. デバッガ・コマンド RUN SQUARES は,修正されたプログラムをデバッガの制御下に置き,正しく動作することを確認できるようにします。

  17. SET BREAK コマンドを使用して,12 行目が実行されるたびに検出されるようにブレークポイントを設定します。DO 句は,ブレークポイントが検出されると,自動的に I と K の値を表示します。

  18. GO コマンドで実行を開始します。

    最初のブレークポイントでは,K の値は 1 になっており,ここまではプログラムが正常に動作していることを示しています。GO コマンドを実行するたびに I と K の現在値が表示されます。2 つの GO コマンドのあと,K は予想どおり 3 になっていますが,I は 4 になっていることに注意してください。これは,INARR の要素の 1 つがゼロであるため,DO ループの繰り返しで 11 行目と 12 行目が実行されなかった(K が増分されなかった)からです。これで,プログラムが正しく動作していることが確認できます。

  19. EXIT コマンドによってデバッギング・セッションを終了し,DCL レベルに制御を戻します。


第 3 章
プログラム実行の制御とモニタ

本章では,デバッグ中にプログラムの実行を制御およびモニタする方法を説明します。

次の 2 つの関連機能については,第 2 章 を参照してください。

第 3.4 節 では,デバッガがプログラムの実行を制御する方法について説明します。

本章には,すべてのプログラムに共通の情報が含まれています。詳細は以下の章を参照してください。

現在のデバッギング・セッションから,プログラムを再実行したり,別のプログラムを実行したりする方法については,第 1.3.3 項 および 第 1.3.4 項 をそれぞれ参照してください。

3.1 プログラムを実行するコマンド

プログラムの実行と直接関連しているデバッガ・コマンドは次の 4 つだけです。

GO
STEP
CALL
EXIT(プログラムに終了ハンドラがある場合)

第 2.3.1 項第 2.3.2 項 で説明したように,GO コマンドと STEP コマンドは,プログラムの実行を開始または再開するための基本的なコマンドです。STEP コマンドについては,第 3.2 節 で詳しく説明します。

デバッギング・セッション中は,ルーチンはプログラムの実行中に呼び出されて実行されます。CALL コマンドを使用すれば,プログラムにリンクされたルーチンを自由に呼び出して実行できます。CALL コマンドについては,第 13.7 節 を参照してください。

EXIT コマンドについては,デバッギング・セッションの終了と関連して 第 1.8 節 で説明しました。EXIT コマンドはプログラム内の任意の終了ハンドラを実行するので,終了ハンドラのデバッグにも有効です(13.6 章を参照)。

これら 4 つのどのコマンドを使用する場合も,次のイベントの発生によってプログラムの実行が中断または停止することに注意してください。

3.2 ステップ単位でのプログラムの実行

STEP コマンド(最もよく使用されるデバッガ・コマンド)を使用すれば,ユーザは,ステップ単位と呼ばれる小さい増分単位でプログラムを実行できます。

省略時の設定では,ステップ単位は実行可能なソース・コードの 1 行です。次の例では,STEP コマンドはソース・コードを 1 行実行し,動作を報告し("stepped to..."),次の実行行の番号(27)とソース・コードを表示しています。


DBG> STEP
stepped to TEST\COUNT\%LINE 27 
     27:   X := X + 1;
DBG>

実行は,モジュール TEST 内の行 27 の最初の機械語コード命令で一時停止しています。27 行目は,モジュール TEST 内のルーチン COUNT 内に存在します。

STEP コマンドは,いくつかのソース行を 1 度に実行することもできます。パラメータとして正の整数を指定すると,STEP コマンドはその行数だけ実行します。次の例では,STEP コマンドは現在の位置から 3 行だけ実行します。


DBG> STEP 3
stepped to TEST\COUNT\%LINE 34 
     34:   SWAP(X,Y);
DBG>

デバッガは,コンパイラがコード命令を生成したソース行だけを実行可能な行として認識することに注意してください。コメント行などの他の行はスキップされます。また,1 行内に 2 つ以上の文が含まれる場合,デバッガは,その行のすべての命令を 1 ステップとして実行します。

省略時の設定では,デバッグ中のモジュールのソース行が使用可能な場合には,ステップ実行後にソース行が表示されます。コンパイル時およびリンク時に,/DEBUG 修飾子を使用してしていないコード(たとえば,共用可能イメージ・ルーチン)内の命令をステップ実行する場合,ソース行は使用できません。ソース行が使用可能な場合は,SET STEP [NO]SOURCE コマンドおよび STEP コマンドの /[NO]SOURCE 修飾子を使用して,その表示を制御できます。ソース・コードの表示方法の概略,特にステップ実行後の表示方法についての説明は,第 6 章 を参照してください。

3.2.1 STEPコマンドの動作の変更

ユーザは,STEP コマンドの省略時の動作を次の 2 つの方法で変更できます。

次の例では,プログラム・カウンタ(PC)が CALL 文を指しているとき,STEP/INTO コマンドが,呼び出されたルーチン内の命令をステップ実行します。デバッガは,モジュール TEST 内のルーチン COUNT から呼び出されたルーチン PRODUCT のソース行を表示します。


DBG> STEP/INTO
stepped to routine TEST\PRODUCT 
     6:    function PRODUCT(X,Y : INTEGER)return INTEGER is 
DBG>

STEP/INTO コマンドの実行後は,後続の STEP コマンドは省略時の動作に戻ります。

これとは対照的に,SET STEP を使用すると,STEP コマンドの新しい省略時の動作が設定されます。いったん設定された動作は,別の SET STEP コマンドが入力されるまで有効です。たとえば,SET STEP INTO コマンドによって,後続の STEP コマンドは STEP/INTO コマンドのように動作します。SET STEP LINE コマンドであれば,後続の STEP コマンドは STEP/LINE コマンドのように動作します。

SET STEP コマンド・パラメータは STEP コマンドの各修飾子に対応しています。

STEP コマンドに,現在の省略時の動作とは異なる修飾子を指定することによって,その STEP コマンドの間だけ現在の省略時の動作を上書きすることができます。STEP コマンドの現在の省略時の動作を示すには,SHOW STEP コマンドを使用します。


前へ 次へ 目次 索引