日本-日本語
日本HPホーム 製品 & サービス OpenVMS製品情報
≫  お問い合わせ


OpenVMS マニュアル


 

OpenVMS ドキュメント
ライブラリ

タイトルページ
目次
まえがき
第 1 部:デバッガ概要
第 1 章:デバッガ概要
第 2 部:コマンド・インタフェース
第 2 章:デバッガの起動
第 3 章:プログラム実行の制御とモニタ
第 4 章:プログラム・データの検査と操作
第 5 章:プログラム内シンボルへのアクセス制御
第 6 章:ソース・コードの表示の制御
第 7 章:画面モード
第 3 部:DECwindows インタフェース
第 8 章:DECwindows Motifインタフェースの概要
第 9 章:デバッグ・セッションの開始と終了
第 10 章:デバッガの使用方法
第 4 部:PC クライアント・インタフェース
第 11 章:デバッガの PC クライアント/サーバ・インタフェースの概要
第 5 部:高度なトピック
第 12 章:ヒープ・アナライザの使用
第 13 章:その他の便利な機能
第 14 章:特殊なデバッグ
第 15 章:マルチプロセス・プログラムのデバッグ
第 16 章:タスキング・プログラムのデバッグ
第 6 部:付録
付録 A :定義済みのキー機能
付録 B :組み込みシンボルと論理名
付録 C :各言語に対するデバッガ・サポートの要約
付録 D :EIGHTQUEENS.C
索引
PDF
OpenVMS ホーム

HP OpenVMS
デバッガ説明書


目次 索引



シンボルのあいまいさは,シンボル ( たとえば,変数名 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 行目に到達するたびに検出されるトレースポイントを設定します。

    • /SILENT 修飾子は,"trace at" メッセージを抑制する。/SILENT 修飾子を指定しないと, 11 行目が実行されるたびにこのメッセージが表示される。

    • DO 句は,トレースポイントが検出されるたびにコマンド DEPOSIT K = K + 1 を発行する。

  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 レベルに制御を戻します。


目次 索引

© 2012 Hewlett-Packard Development Company, L.P.