Fortran模块变量在调试器中不可访问

rks*_*171 8 debugging fortran module

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

小智 6

对于较新的GDB(如果我没记错的话,7.2),调试模块很简单.参加以下计划:

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

use modname, only: newvar => var2
newvar = 7
end
Run Code Online (Sandbox Code Playgroud)

你现在可以运行:

$ 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)
Run Code Online (Sandbox Code Playgroud)

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

小智 3

在 gdb 中,尝试使用诸如 __ modulename __ variablename之类的名称引用全局变量

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

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

这是关于此问题的线程:http://gcc.gnu.org/ml/fortran/2005-04/msg00064.html

  • 除了使用 -O0 进行编译之外,这还可以显示非数组元素。我可以打印全局变量,但仍然看不到全局数组的值。当我尝试将数组的名称打印为 __modulename_MOD_arrayname 时,会返回一些看似随机的大数字。如果我尝试打印数组的一个元素,我会得到 -nan(0xf...)。知道如何让数组以及非数组变量正确打印吗? (2认同)