【问题标题】:Fortran module variables not accessible in debuggers调试器中无法访问 Fortran 模块变量
【发布时间】:2012-04-22 00:50:36
【问题描述】:

我使用 gfortran 4.4 和 intel 11.1 编译了一个包含多个模块的 Fortran 代码,随后尝试使用 gdb 和 DDT 对其进行调试。在所有情况下,我都看不到模块中声明的任何变量的值。这些全局变量具有值,因为代码仍然可以正确运行,但我看不到调试器中的值。局部变量很好。我在网上其他地方找不到解决这个问题的方法,所以也许没有直接的解决方案,但是如果我看不到任何全局变量的值,调试我的代码将非常困难。

【问题讨论】:

  • 您是否使用标志 -O0 和 -g 进行编译?
  • 我已经看到了,我所做的是将变量包含在用户类型中,并保留一个全局(已保存)记录。然后你在调试器中使用 % 访问(例如 OT%POINT_COUNT 当 OT 包含我的 gobals 时)
  • 对 Nick Atoms 来说,使用 -O0 编译可以解决问题,但仅适用于非数组元素。我读到优化会导致全局变量无法访问,但我认为如果没有使用优化标志,那么编译器默认不会进行优化。显然,我错了。但是,我仍然无法访问全局数组中的任何信息。同样,它们被正确读取并赋值,但我无法在调试器中打印整个数组或数组中的任何单个元素。
  • 我问了一个类似的问题,后来自己回答了。主要涉及将指针转换为不同的类型,然后您可以根据需要查看它们(如数组、结构等)stackoverflow.com/questions/46141549/…

标签: debugging module fortran


【解决方案1】:

使用较新的 GDB(如果我没记错的话是 7.2),调试模块很简单。采取以下程序:

module modname
  integer :: var1 = 1 , var2 = 2
end module modname

use modname, only: newvar => var2
newvar = 7
end

你现在可以运行了:

$ gfortran -g -o mytest test.f90; gdb --quiet ./mytest
Reading symbols from /dev/shm/mytest...done.
(gdb) b 6
Breakpoint 1 at 0x4006a0: file test.f90, line 6.
(gdb) run
Starting program: /dev/shm/mytest
Breakpoint 1, MAIN__ () at test.f90:6
6       newvar = 7
(gdb) p newvar
$1 = 2
(gdb) p var1
No symbol "var1" in current context.
(gdb) p modname::var1
$2 = 1
(gdb) p modname::var2
$3 = 2
(gdb) n
7       end
(gdb) p modname::var2
$4 = 7
(gdb)

【讨论】:

  • 这必须是 gdb 7.2,因为我的系统上安装了 7.1 并且键入“p modname::var”仍然会导致“当前上下文中没有符号”。但是,请注意,整个问题似乎是 gfortran 问题而不是 gdb 问题,因为当我使用 intel ifort 11.1 构建源代码时,gdb 在打印局部或全局变量或数组时没有问题。没有使用 gfortran 优化的构建允许打印全局变量,但仍然不能打印全局数组。
【解决方案2】:

在 gdb 中,尝试使用 __modulename__variablename

之类的名称引用全局变量

您可以使用 nm 和 grep 来检查这是否是正确的修改方案,以在程序的符号中找到您的全局变量之一。

如果这不起作用,请确保您使用的是最新版本的 gdb。

这里有一个关于这个问题的帖子:http://gcc.gnu.org/ml/fortran/2005-04/msg00064.html

【讨论】:

  • 除了使用 -O0 编译外,它还可以显示非数组元素。我可以打印全局变量,但我仍然看不到全局数组的值。当我尝试将数组的名称打印为 __modulename_MOD_arrayname 时,会返回一些看似随机的大数。如果我尝试打印数组的一个元素,我会得到 -nan(0xf...)。知道如何正确打印出数组以及非数组变量吗?
  • 为了记录我的进度,我尝试使用 intel 11.1(这次使用 -O0)进行构建并使用 gdb 进行调试,所有全局变量和全局数组都可以正确打印出来。我尝试使用 g95 构建并使用 gdb 进行调试,即使使用 -O0 构建全局变量也不会打印出来(我必须使用上面列出的命名约定来获取它们)。但是全局数组仍然没有打印出来。所以总而言之,这似乎是 gfortran 和 g95 而不是 gdb 的问题。并且使用英特尔 11.1 构建工作正常。
【解决方案3】:

我遇到了同样的问题(GNU gdb 7.9 与 MPI 并行运行)。对我有用的是:

p __modname_mod_var

即:双下划线,模块名,下划线,mod,变量名。

使用 -gstabs+ 而不是 -g 编译也可以解决一些问题(但不是目前的问题)。

【讨论】:

    猜你喜欢
    • 2016-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    • 1970-01-01
    • 2014-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多