dbx コマンドによるデバッグ

Fortran のデバッグ

次のアドバイスと概要は、Fortran プログラムをデバッグするときに役立ちます。

カレントプロシージャとカレントファイル

デバッグセッション中、dbx は、1 つのプロシージャと 1 つのソースファイルをカレントとして定義します。ブレークポイントの設定要求と変数の出力または設定要求は、カレントの関数とファイルに関連付けて解釈されます。したがって、stop at 5 は、カレントファイルが a1.fa2.f、または a3.f のどれであるかによって、3 つの異なるブレークポイントのうち 1 つを設定します。

大文字 (FORTRAN 77 の場合のみ)

プログラムのいずれかの識別子に大文字が含まれる場合、dbx はそれらを認識します。いくつかの旧バージョンの場合のように、大文字/小文字を区別するコマンド、または区別しないコマンドを指定する必要はありません。

FORTRAN 77 と dbx は、大文字/小文字を区別するモードまたは区別しないモードのいずれかに統一する必要があります。

ソースに LAST という変数がある場合、dbx では、print LAST コマンドおよび print last コマンドはいずれも要求どおりに動作します。

ソースに LAST という変数と last という変数がある場合、dbx では、print LAST コマンドは動作しますが、print last コマンドは動作しません。FORTRAN 77dbx はいずれも、LASTlast を要求どおりに区別します。


注 -

dbxenv case insensitive 環境属性を設定しても、dbx ではファイル名またはディレクトリ名について、大文字/小文字を常に区別します。


最適化プログラム

最適化プログラムをデバッグするには、次のことを行ってください。

デバッグの主プログラム

a1.f


        PARAMETER ( n=2 )
        REAL twobytwo(2,2) / 4 *-1 /
        CALL mkidentity( twobytwo, n )
        PRINT *, determinant( twobytwo )
        END

デバッグのサブルーチン

a2.f


        SUBROUTINE mkidentity ( array, m )
        REAL array(m,m)
        DO 90 i = 1, m 	DO 20 j = 1, m
            IF ( i .EQ. j ) THEN
            array(i,j) = 1.
            ELSE
            array(i,j) = 0.
            END IF 
20      CONTINUE 
90      CONTINUE 
        RETURN 
        END 

デバッグの関数

a3.f


        REAL FUNCTION determinant ( a ) 
        REAL a(2,2) 
        determinant = a(1,1) * a(2,2) - a(1,2) / a(2,1) 
        RETURN 
        END 

dbx のサンプルセッション

以下の例では、上記のサンプルプログラム my_program を使用しています。

  1. -g フラグを付けてコンパイルとリンクを行います。次のように 、1 度にまたは 2 度に分けて実行できます。

    -g フラグ付きコンパイルとリンクを 1 度にまとめて行います。


     demo% f77 -o my_program -g a1.f a2.f a3.f

    コンパイルとリンクを分けて行います。


     demo% f77 -c -g a1.f a2.f a3.f 
     demo% f77 -o my_program a1.o a2.o a3.o

  2. 実行可能ファイル my_program について dbx を起動します。


    demo% dbx my_program
    my_program の読み込み中
    ld.so.1 の読み込み中
    libF77.so.4 の読み込み中
    libM77.so.2 の読み込み中
    libsunmath.so.1 の読み込み中
    libm.so.1 の読み込み中
    libc.so.1 の読み込み中
    libdl.so.1 の読み込み中
    libc_psr.so.1 の読み込み中

  3. stop in subnam と入力して、最初の実行可能文の前にブレークポイントを設定する。subnam は、サブルーチン、関数、ブロックデータサブプログラムを示します。

    main プログラム中の最初の実行可能文で停止します。


     (dbx) stop in MAIN 
     (2) stop in MAIN 

    通常 MAIN は大文字ですが、subnam は大文字でも小文字でもかまいません。

  4. run コマンドを入力して、dbx からプログラムを実行します。dbx の起動時に指定された実行可能ファイルの中で、プログラムが実行されます。

    dbx 内でプログラムを実行します。


    (dbx) run
    実行中: my_program
    (プロセス id 23395)
    mb.so.1 の読み込み中
    wcwidth.so.1 の読み込み中
    MAIN で停止しました 行番号 3  ファイル "a1.f"
        3           call mkidentity( twobytwo, n )
    (dbx) 

    ブレークポイントに到達すると、dbx はどこで停止したかを示すメッセージを表示します。上の例では、a1.f ファイルの行番号 3 で停止しています。

  5. print コマンドを使用して、値を出力します。

    n の値を出力します。


     (dbx) print n
     n = 2 

    マトリックス twobytwo を出力します。


    (dbx) print twobytwo 
    twobytwo =
        (1,1)       -1.0 
        (2,1)       -1.0 
        (1,2)       -1.0 
        (2,2)       -1.0 

    マトリックス array を出力します。


    (dbx) print array
    dbx: "array" は スコープ`my_program`a1.f`MAIN` に定義されていません
    dbx: 詳しくは 'help scope' をご覧ください
    (dbx) 

    ここで array は定義されていないため、出力は失敗します (mkidentity 内でのみ有効)。

  6. next コマンドを使用して、次の行に実行を進めます。

    次の行に実行を進めます。


    (dbx) next
    MAIN で停止しました 行番号 4  ファイル "a1.f"
        4  print *, determinant( twobytwo ) 
    (dbx) print twobytwo
    twobytwo = 
        (1,1)       1.0
        (2,1)       0.0
        (1,2)       0.0
        (2,2)       1.0
    
    (dbx) 

    next コマンドは現在のソース行を実行し、次のソース行で停止します。これは副プログラムの呼び出しを 1 つの文として数えます。

    nextstep コマンドを比較します。step コマンドは、ソースの次の行または副プログラムの次のステップを実行します。通常、次の実行可能ソース文がサブルーチンまたは関数呼び出しの場合、各コマンドは次の処理を行います。

    • step コマンドは、副プログラムのソースの最初の文にブレークポイントを設定します。

    • next コマンドは、呼び出し元のプログラム中で、呼び出しの後の最初の文にブレークポイントを設定します。

  7. quit コマンドを入力して、dbx を終了します。


     (dbx)quit		
     demo%