Sun Studio 12 Update 1:使用 dbx 调试程序

dbx 会话样例

下面的示例中使用称为 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

Procedure运行 dbx 会话样例

  1. 使用 - g 选项进行编译和链接。

    可以通过一两个步骤来完成此操作。

    使用 -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
    
  2. 对名为 my_program 的可执行文件启动 dbx


     demo% dbx my_program
     Reading symbolic information…
  3. 键入 stop in subnam 来设置简单断点,其中 subnam 是子例程、函数或块数据子程序的名称。

    在主程序的第一个可执行语句处停止。


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

    尽管 MAIN 必须全部为大写字母,但 subnam 大小写均可。

  4. 键入 run 命令,它会运行启动 dbx 时指定的可执行文件中的程序。


     (dbx) run
     Running: my_program
     stopped in MAIN at line 3 in file "a1.f"
         3         call mkidentity( twobytwo, n )

    到达断点时,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" is not defined in the current scope
    (dbx)

    打印失败的原因是此处未定义 array,而只是在 mkidentity 中进行了定义。

  6. 要继续执行到下一行,请键入 next 命令。

    继续执行到下一行:


    (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 命令在调用后的第一个源代码语句处但仍在调用程序中设置断点。

  7. 要退出 dbx,请键入 quit 命令。


    (dbx)quit        
    demo%