以下是一些有助于您调试 Fortran 程序的提示和一般性概念。有关使用 dbx 调试 Fortran OpenMP 代码的信息,请参见与事件交互。
调试会话期间,dbx 会将过程和源文件定义为当前过程和源文件。设置断点及输出或设置变量的请求都相对于当前函数和文件来解释。因此,stop at 5 会根据哪一个文件是当前文件来设置不同的断点。
程序的标识符中有大写字母时,dbx 会识别出它们。无需提供区分大小写或不区分大小写的命令,而某些早期版本中需要提供。
Fortran 95 和 dbx 必须都处于区分大小写模式或不区分大小写模式下:
在不区分大小写模式下,编译和调试时无需使用 -U 选项。这时,dbx 环境变量 input_case_sensitive 的缺省值为 false。
如果源代码中有名为 LAST 的变量,则在 dbx 中,print LAST 或 print last 命令都有效。Fortran 95 和 dbx 按照要求将 LAST 和 last 视为相同。
在区分大小写模式下,编译和调试时使用 -U。这时,dbx 环境变量 input_case_sensitive 的缺省值为 true。
如果源代码中有一个名为 LAST 和一个名为 last 的变量,则在 dbx 中,print last 有效,而 print LAST 无效。Fortran 95 和 dbx 按照要求区分 LAST 和 last。
下面的示例中使用称为 my_program 的样例程序。
用于调试的主程序 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
可以通过一两个步骤来完成此操作。
使用 -g 一步完成编译和链接:
demo% f95 -o my_program -g a1.f a2.f a3.f
或分步完成编译和链接:
demo% f95 -c -g a1.f a2.f a3.f demo% f95 -o my_program a1.o a2.o a3.o
demo% dbx my_program Reading symbolic information…
在主程序的第一个可执行语句处停止。
(dbx) stop in MAIN (2) stop in MAIN
尽管 MAIN 必须全部为大写字母,但 subnam 大小写均可。
(dbx) run Running: my_program stopped in MAIN at line 3 in file "a1.f" 3 call mkidentity( twobytwo, n )
到达断点时,dbx 会显示一条消息,指出其停止位置(本例中为文件 a1.f 的第 3 行)。
输出 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" is not defined in the current scope (dbx)
输出失败的原因是此处未定义 array,而只是在 mkidentity 中进行了定义。
继续执行到下一行:
(dbx) next stopped in MAIN at line 4 in file "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) quit demo%
next 命令会执行当前源代码行并在下一行处停止。它将各次子程序调用按独立的语句来计数。
next 命令与 step 命令不同。step 命令会执行下一个源代码行或进入子程序的下一步。如果下一个可执行源代码语句是一个子例程或函数调用,则:
step 命令在子程序的第一个源代码语句处设置断点。
next 命令在调用后的第一个源代码语句处但仍在调用程序中设置断点。
(dbx)quit demo%