HP OpenVMS Systems Documentation |
| 前へ | 次へ | 目次 | 索引 |
プログラムに関連するシンボル ( 変数名,ルーチン名,ソース・コード,行番号など ) への完全なアクセスを保証するには, 第 1.2 節 で説明したように,/DEBUG 修飾子を使用してプログラムをコンパイルおよびリンクしなければなりません。
これらの条件を満たしていれば,デバッガによるシンボルの処理方法は,ほとんどの場合,ユーザには見えません。ただし,次の2つの場合は,何らかの処置が必要です。
シンボル検索を容易にするために,デバッガは,シンボル情報を実行可能なイメージから実行時シンボル・テーブル (RST) にロードします。これで,シンボル情報に効率的にアクセスできるようになります。シンボルが RST 内に存在しない場合,デバッガはそのシンボルを認識しないか,または正確に解釈しません。
RST はメモリ領域を占有するため,デバッガは,プログラムの実行中に参照されると思われるシンボルを予想しながら,動的にシンボルをロードします。特定のモジュールのすべてのシンボル情報が,一度に RST テーブル内にロードされるため,このロード処理を モジュール設定 と呼びます。
最初に,イメージ遷移アドレスを含むモジュールだけが設定されます。その後,プログラムの実行が中断するたびに,中断ルーチンを含むモジュールが設定されます。この結果,ユーザは,その記憶位置で見えなければならないシンボルを参照できるようになります。
設定されていないモジュール内のシンボルを参照しようとすると,デバッガは,シンボルがRSTに設定されていないことをユーザに警告します。次に例を示します。
DBG> EXAMINE K %DEBUG-W-NOSYMBOL, symbol 'K' is not in symbol table DBG> |
このような場合は,SET MODULE コマンドを使用して,そのシンボルを含むモジュールを明示的に設定しなければなりません。次に例を示します。
DBG> SET MODULE MOD3 DBG> EXAMINE K MOD3\ROUT2\K: 26 DBG> |
SHOW MODULE コマンドは,プログラム内のモジュールをリストし,設定されているモジュールを識別します。
動的なモジュール設定は,設定されるモジュール数が増えるに従って,デバッガの処理速度を低下させます。性能の低下が問題になる場合は, CANCEL MODULE コマンドを使用して設定モジュール数を減らすか,または SET MODE NODYNAMIC コマンドを入力して動的モジュール設定を禁止します。動的モジュール設定を使用可能にするには,SET MODE DYNAMIC コマンドを使用します。
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 という名前のこのプログラムは,次の機能を持っています。
| 例 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 は,デバッグ中のプログラムを示しています。
本章では,デバッグ中にプログラムの実行を制御およびモニタする方法を説明します。
次の 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 コマンドは,いくつかのソース行を一度に実行することもできます。パラメータとして正の整数を指定すると,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 章 を参照してください。
| 前へ | 次へ | 目次 | 索引 |