Debugging 在调试器中无法访问Fortran模块变量

Debugging 在调试器中无法访问Fortran模块变量,debugging,module,fortran,Debugging,Module,Fortran,我已经编译了一个Fortran代码,其中包含几个模块,使用gfortran 4.4和intel 11.1,随后尝试使用gdb和DDT对其进行调试。在所有情况下,我都看不到模块中声明的任何变量的值。这些全局变量有值,因为代码仍然正确运行,但我看不到调试器中的值。局部变量很好。我在网上的其他地方很难找到这个问题的解决方案,所以可能没有直接的解决方案,但是如果我看不到任何全局变量的值,那么调试我的代码将非常困难。在gdb中,试着用u modulename\uu variablename这样的名称引用全

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

在gdb中,试着用u modulename\uu variablename这样的名称引用全局变量

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

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

这里有一个关于这个问题的线索:

对于较新的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)
我也有同样的问题(GNUGDB7.9与MPI并行运行)。对我起作用的是:

p\uuuuModName\uMod\uVar

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


使用-gstabs+而不是-g进行编译可能也会解决一些问题(但不是当前的问题)。

是否使用标志-O0和-g进行编译?我已经看到了这一点,我所做的是将变量包含在用户类型中,并保留一条全局(已保存)记录。然后在调试器中使用(例如OT%POINT_COUNT,当OT包含我的gobals时)访问Nick Atoms,使用-O0编译实现了这一点,但仅针对非数组元素。我读到优化会导致全局变量不可访问,但我认为如果没有使用优化标志,那么编译器默认不会进行优化。显然,我错了。但是,我仍然无法访问全局数组中的任何信息。同样,它们被正确地读入并赋值,但我无法在调试器中打印整个数组或数组中的任何单个元素。我问了一个类似的问题,后来我自己能够回答。它主要涉及将指针强制转换为不同的类型,然后您可以按照自己的意愿查看它们(如数组、结构等)。除了使用-O0编译之外,这还可以显示非数组元素。我可以打印全局变量,但仍然看不到全局数组的值。当我尝试将数组的名称打印为uuModuleName\uMod\uArrayName时,会返回一些看似随机的大数字。如果我试图打印数组中的一个元素,我会得到-nan(0xf…)。你知道如何让数组和非数组变量一样正确地打印出来吗?请注意我的进度,我尝试使用intel 11.1(这次使用-O0)构建并使用gdb进行调试,所有全局变量和全局数组都正确地打印出来。我试着用g95构建,用gdb调试,即使用-O0构建,全局变量也不会打印出来(我必须使用上面列出的命名约定来获得它们)。但全局数组仍然无法打印出来。总之,这似乎是gfortran和g95的问题,而不是gdb的问题。使用intel 11.1进行构建工作正常。这必须是gdb 7.2,因为我的系统上安装了7.1,键入“p modname::var”仍然会导致“当前上下文中没有符号”。但是,请注意,整个问题似乎是gfortran问题,而不是gdb问题,因为当我使用intel ifort 11.1构建源代码时,gdb在打印局部或全局变量或数组方面没有问题。使用gfortran进行无优化的构建允许打印全局变量,但仍然不能打印全局数组。