前へ | 次へ | 目次 | 索引 |
シンボルのあいまいさは,シンボル(たとえば,変数名 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 という名前のこのプログラムは,次の機能を持っています。
例 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 は,デバッグ中のプログラムを示しています。
/NOOPTIMIZE 修飾子は,Fortran コンパイラの最適化を禁止して,実行可能なコードとプログラムのソース・コードが一致するようにしています。最適化されたコードをデバッグすると,いくつかのプログラム記憶位置の内容とソース・コードの表示内容とが一致しないことがあるため,混乱を招きます。
最初にメイン・プログラム単位の先頭(この例では,SQUARES の 1 行目)で実行は一時停止します。
コマンド STEP 4 によって,プログラムのソース行が 4 行実行されます。9 行目で実行は一時停止します。STEP コマンドは,実行可能なコードに変換されなかったソース行を無視することに注意してください。また,省略時の設定では,デバッガは実行が一時停止したソース行を表示します。
I の値は,予想どおり 1 です。しかし,K の値は 0 になっており,予想していた値 1 ではありません。ここでエラーが発見されました。K は,ループ内の 11 行目で使用される直前に増分されなければなりません。
プログラムの出力は,パッチされたプログラムが正しく動作したことを示します。EXITSTATUS メッセージは,プログラムが最後まで実行されたことを示します。
最初のブレークポイントでは,K の値は 1 になっており,ここまではプログラムが正常に動作していることを示しています。GO コマンドを実行するたびに I と K の現在値が表示されます。2 つの GO コマンドのあと,K は予想どおり 3 になっていますが,I は 4 になっていることに注意してください。これは,INARR の要素の 1 つがゼロであるため,DO ループの繰り返しで 11 行目と 12 行目が実行されなかった(K が増分されなかった)からです。これで,プログラムが正しく動作していることが確認できます。
本章では,デバッグ中にプログラムの実行を制御およびモニタする方法を説明します。
次の 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 つのどのコマンドを使用する場合も,次のイベントの発生によってプログラムの実行が中断または停止することに注意してください。
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 コマンドを使用します。
前へ | 次へ | 目次 | 索引 |