JavaScript is required to for searching.
跳过导航链接
退出打印视图
Oracle Solaris Studio 12.3:使用 dbx 调试程序     Oracle Solaris Studio 12.3 Information Library (简体中文)
search filter icon
search icon

文档信息

前言

1.  dbx 入门

2.  启动 dbx

3.  定制 dbx

4.  查看和导航到代码

5.  控制程序执行

6.  设置断点和跟踪

7.  使用调用堆栈

8.  求值和显示数据

9.  使用运行时检查

10.  修复并继续

11.  调试多线程应用程序

12.  调试子进程

13.  调试 OpenMP 程序

14.  处理信号

15.  使用 dbx 调试 C++

16.  使用 dbx 调试 Fortran

调试 Fortran

当前过程和文件

大写字母

dbx 会话样例

运行 dbx 会话样例

调试段故障

使用 dbx 找出问题

定位异常

跟踪调用

处理数组

Fortran 95 可分配数组

显示内函数

显示复数表达式

显示区间表达式

显示逻辑运算符

查看 Fortran 95 派生类型

指向 Fortran 95 派生类型的指针

面向对象的 Fortran

可分配的标量类型

17.  使用 dbx 调试 Java 应用程序

18.  在机器指令级调试

19.  将 dbx 与 Korn Shell 配合使用

20.  调试共享库

A.  修改程序状态

B.  事件管理

C.  宏

D.  命令参考

索引

调试 Fortran

以下是一些有助于您调试 Fortran 程序的提示和一般性概念。有关使用 dbx 调试 Fortran OpenMP 代码的信息,请参见与事件交互

当前过程和文件

调试会话期间,dbx 会将过程和源文件定义为当前过程和源文件。设置断点及输出或设置变量的请求都相对于当前函数和文件来解释。因此,stop at 5 会根据哪一个文件是当前文件来设置不同的断点。

大写字母

程序的标识符中有大写字母时,dbx 会识别出它们。无需提供区分大小写或不区分大小写的命令,而某些早期版本中需要提供。

Fortran 95 和 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

运行 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%