次のアドバイスと概要は、Fortran プログラムをデバッグするときに役立ちます。
デバッグセッション中、dbx は、1 つのプロシージャと 1 つのソースファイルをカレントとして定義します。ブレークポイントの設定要求と変数の出力または設定要求は、カレントの関数とファイルに関連付けて解釈されます。したがって、stop at 5 は、カレントファイルが a1.f、a2.f、または a3.f のどれであるかによって、3 つの異なるブレークポイントのうち 1 つを設定します。
プログラムのいずれかの識別子に大文字が含まれる場合、dbx はそれらを認識します。いくつかの旧バージョンの場合のように、大文字/小文字を区別するコマンド、または区別しないコマンドを指定する必要はありません。
FORTRAN 77 と dbx は、大文字/小文字を区別するモードまたは区別しないモードのいずれかに統一する必要があります。
大文字/小文字を区別しないモードでコンパイルとデバッグを行うには、-U オプションを付けずにこれらの処理を行います。dbx のデフォルトは、dbxenv case insensitive になります。
ソースに LAST という変数がある場合、dbx では、print LAST コマンドおよび print last コマンドはいずれも要求どおりに動作します。
大文字/小文字を区別するモードでコンパイルとデバッグを行うには、-U オプションを使用します。dbx のデフォルトは dbxenv case sensitive になります。
ソースに LAST という変数と last という変数がある場合、dbx では、print LAST コマンドは動作しますが、print last コマンドは動作しません。FORTRAN 77 と dbx はいずれも、LAST と last を要求どおりに区別します。
dbxenv case insensitive 環境属性を設定しても、dbx ではファイル名またはディレクトリ名について、大文字/小文字を常に区別します。
最適化プログラムをデバッグするには、次のことを行ってください。
-g を付けて、-On を付けずにメインプログラムをコンパイルする。
適切な -On を付けて、プログラムのルーチンを 1 つおきにコンパイルする。
dbx のもとで実行を開始する。
デバッグしたいルーチンに対して fix -g any.f を使用する。ただし、-On は付けない。
コンパイルされたルーチンに対して continue を使用する。
デバッグの主プログラム
PARAMETER ( n=2 ) REAL twobytwo(2,2) / 4 *-1 / CALL mkidentity( twobytwo, n ) PRINT *, determinant( twobytwo ) END
デバッグのサブルーチン
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
デバッグの関数
REAL FUNCTION determinant ( a ) REAL a(2,2) determinant = a(1,1) * a(2,2) - a(1,2) / a(2,1) RETURN END
以下の例では、上記のサンプルプログラム my_program を使用しています。
-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
実行可能ファイル 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 の読み込み中
stop in subnam と入力して、最初の実行可能文の前にブレークポイントを設定する。subnam は、サブルーチン、関数、ブロックデータサブプログラムを示します。
(dbx) stop in MAIN (2) stop in MAIN
通常 MAIN は大文字ですが、subnam は大文字でも小文字でもかまいません。
run コマンドを入力して、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 で停止しています。
print コマンドを使用して、値を出力します。
(dbx) print n n = 2
(dbx) print twobytwo twobytwo = (1,1) -1.0 (2,1) -1.0 (1,2) -1.0 (2,2) -1.0
(dbx) print array dbx: "array" は スコープ`my_program`a1.f`MAIN` に定義されていません dbx: 詳しくは 'help scope' をご覧ください (dbx)
ここで array は定義されていないため、出力は失敗します (mkidentity 内でのみ有効)。
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 つの文として数えます。
next と step コマンドを比較します。step コマンドは、ソースの次の行または副プログラムの次のステップを実行します。通常、次の実行可能ソース文がサブルーチンまたは関数呼び出しの場合、各コマンドは次の処理を行います。
step コマンドは、副プログラムのソースの最初の文にブレークポイントを設定します。
next コマンドは、呼び出し元のプログラム中で、呼び出しの後の最初の文にブレークポイントを設定します。
(dbx)quit demo%