gdb中的Fortran打印可分配数组

gdb中的Fortran打印可分配数组,gdb,fortran,gfortran,fortran95,Gdb,Fortran,Gfortran,Fortran95,我在开源科学代码中添加了一些功能。我处理很多可分配项,但在正确打印它们时遇到了一些问题。例如,我声明并分配,然后使用: real(dp), allocatable :: psi_n_phi(:) ! some other stuff here allocate(psi_n_phi(1:fock_info%nocc(isp))) ! nocc(isp) is simply equal to 1 in this context ! some other stuff here do n = 1, fo

我在开源科学代码中添加了一些功能。我处理很多可分配项,但在正确打印它们时遇到了一些问题。例如,我声明并分配,然后使用:

real(dp), allocatable :: psi_n_phi(:)
! some other stuff here
allocate(psi_n_phi(1:fock_info%nocc(isp)))
! nocc(isp) is simply equal to 1 in this context
! some other stuff here
do n = 1, fock_info%nocc(isp)
    psi_n_phi(n) = dot_product(fock_info%psi(:, n, isp), p)
enddo
后来我得到一个数组不匹配,我正在使用gdb找出原因。如果我打印:

(gdb) p psi_n_phi 
$23 = (0)
但事实显然并非如此,这可以从以下方面得到证明:

(gdb) p psi_n_phi@1
$25 = (( 0) )
(gdb) p psi_n_phi@2
$26 = (( 0) ( 0) )
(gdb) p psi_n_phi@10
$28 = (( 0) ( 0) ( 0) ( 2.0162819006781271e-320) ( 2.2600760244771319e-316) ( 2.3792209431030402e-316) ( 6.9179818424594845e-310) ( 2.2598704931684619e-316) ( 6.9179818424672413e-310) ( 0) )
我从中获得了有关使用
@
符号的信息。这几乎是我能找到的关于这个问题的唯一来源,尽管我见过一些其他问题,人们遇到类似的问题(但没有人能够解决它)


有什么想法吗?我想了解为什么打印出来的是
((0))
,以及如何让它像普通阵列一样打印。

不幸的是,GDB trunk不支持可分配阵列。但弓箭手分会也提供了一些支持

我最近读了Tobias Burnus的以下帖子:

我使用Ubuntu 14.02。我下载了gdb最新的OpenSUSE rpm包,并通过如下命令将其解压缩

rpm2cpio myrpmfile.rpm | cpio -idmv
然后我在/usr/local/bin中复制了gdb可执行程序(使用sudocp),我很高兴看到它正常工作

使用

(gdb) print *((real *)A+m)@n

其中A是数组,m是位置的移位(在m=0的情况下无需写入+m),n是要打印的元素数。如果您使用的是双精度实数,则用实数替换实数。此外,对于整数,用int替换实数,对于长整数,使用long_int

这个问题已经讨论了将近十年(例如),并且在一些发行版中得到了部分修复。我在gdb中遇到了与Ubuntu 14.04 LTS相同的问题。该解决方案与Francois Jacq在此建议的方式类似,但不会损坏dpkg控制的目录

我使用了本地Ubuntu repo中的alien工具将一个gdb RPM从Fedora(即GNU gdb(gdb)Fedora 7.9-10.fc23)转换成.deb包,然后使用dpkg安装它。现在,我以类似的方式从OpenSUSE安装了gdb-7.9.1-7.1.x86_64.rpm:

fakeroot alien gdb-7.9.1-7.1.x86_64.rpm
sudo dpkg -i gdb_7.9.1-8.1_amd64.deb
在许多情况下,它可以正确地使用简单的指针和可分配数组。尽管gdb的断层通常在试图接触大型和/或复杂结构时发生。也许,这就是为什么许多维护人员不愿意将fortran补丁纳入主流的原因


请考虑确认Disto bug跟踪程序中的bug,因此维护人员将更加关注它。

GDB版本7.91-1被报告在CygWin工作。