【问题标题】:GDB and Fortran modulesGDB 和 Fortran 模块
【发布时间】:2016-09-14 13:50:10
【问题描述】:

我有以下 Fortran 95 代码:

MODULE ISSUE
    IMPLICIT NONE
    CONTAINS
    SUBROUTINE PROBLEM(A)
        IMPLICIT NONE
        DOUBLE PRECISION, DIMENSION(:,:), INTENT(INOUT) :: A
        INTEGER :: i, n

        n = SIZE(A, 2)

        DO i = 1, n
            PRINT *, A(i, 1:n)
        ENDDO

    END SUBROUTINE PROBLEM
END MODULE ISSUE

PROGRAM TEST
    USE ISSUE
    IMPLICIT NONE
    DOUBLE PRECISION, DIMENSION(5, 5) :: A

    A = TRANSPOSE(RESHAPE((/ 1, 2, 3, 4, 5, & 
                             6, 7, 8, 9, 0, &
                             1, 2, 3, 4, 5, &
                             6, 7, 8, 9, 0, &
                             1, 2, 3, 4, 5/), SHAPE(A)))
    CALL PROBLEM(A)
END PROGRAM TEST

现在我使用

编译它
gfortran -g -O0 problem.f95 -o problem

然后我使用 GDB 7.7.1 运行程序,并在第 11 行设置断点 (DO i = 1, n)。之后,我打印矩阵 A 的第一个元素。我得到的输出是:

(gdb) break 11
Breakpoint 1 at 0x4008c5: file problem.f95, line 11.
(gdb) run
Starting program: /path_to_problem_folder/problem 

Breakpoint 1, issue::problem (a=...) at problem.f95:11
warning: Source file is more recent than executable.
11              DO i = 1, n
(gdb) p A(1, 1)
$1 = 6.9533558074105031e-310

我希望输出 1,但 6.9533558074105031e-310 是由 gdb 打印的。请注意,子例程 PROBLEM 正确打印所有值。

为什么会发生这种情况以及如何使用 GDB 正确打印值 A(1, 1)

【问题讨论】:

  • warning: Source file is more recent than executable. 一般不好。这意味着调试器没有重新加载可执行文件,或者您编译了 THEN 更改了源代码中的内容。
  • 那是因为我在复制粘贴之前用VIM识别了它。请注意,StackOverflow 需要一个额外的 TAB 才能将其检测为代码。保存,重新编译并再次设置调试器后问题仍然存在。
  • 我在 Debian sid x86_64 系统上使用 gdb 7.11.1 和 gfortran 6.2.0 时看不到这种行为。也许您可以具体说明您正在使用的 gdb 和 gfortran 版本。

标签: fortran gdb


【解决方案1】:

我将 GDB 版本从 7.7.1 更新到 7.11.1,问题消失了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-21
    • 1970-01-01
    • 1970-01-01
    • 2020-10-17
    相关资源
    最近更新 更多