Fortran在gdb中打印可分配数组
Posted
技术标签:
【中文标题】Fortran在gdb中打印可分配数组【英文标题】:Fortran print allocatable array in gdb 【发布时间】:2015-05-26 12:40:37 【问题描述】:我正在向开源科学代码添加一些功能。我使用了很多可分配对象,但是在正确打印它们时遇到了一些麻烦。比如我声明并分配,然后使用:
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) )
我从http://numericalnoob.blogspot.co.il/2012/08/fortran-allocatable-arrays-and-pointers.html 获得了有关使用@
表示法的信息。这只是我能找到的关于这个问题的唯一来源,尽管我看到了一些其他问题,人们遇到了类似的问题(但没有一个能够解决它)。
这里有什么想法吗?我想了解为什么将它打印为((0))
,以及如何让它像普通数组一样打印。
【问题讨论】:
【参考方案1】:使用
(gdb) print *((real *)A+m)@n
其中 A 是数组,m 是位置的偏移(在 m=0 的情况下不需要写 +m),n 是要打印的元素数。如果您使用双精度实数,则将 real_8 替换为 real_8。此外,对于整数,用 int 替换 real,对于长整数,使用 long_int。归功于http://numericalnoob.blogspot.fr/2012/08/fortran-allocatable-arrays-and-pointers.html
【讨论】:
【参考方案2】:更新:在 Ubuntu 16.04 LTS 中开箱即用
这个问题已经讨论了将近十年(例如https://sourceware.org/bugzilla/show_bug.cgi?id=9395),并且在某些发行版中得到了部分修复。我在 Ubuntu 14.04 LTS 附带的 gdb 中有 reported 相同的问题。解决方法与 Francois Jacq 在此处建议的方式类似,但不会损坏 dpkg 控制的目录。
我使用了来自本地 Ubuntu repo 的外星工具将一个 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 补丁纳入主流的原因......
请考虑在您的发行版错误跟踪器中确认该错误,以便维护人员更加关注它。
【讨论】:
【参考方案3】:不幸的是,GDB 主干不支持可分配数组。但是 Archer 分支包含一些支持。
我最近阅读了 Tobias Burnus 的以下帖子:
https://gcc.gnu.org/ml/fortran/2012-09/msg00013.html
我使用 Ubuntu 14.02。我下载了 gdb 的最新 OpenSUSE rpm 包,并通过类似
的命令将其解压缩rpm2cpio myrpmfile.rpm | cpio -idmv
然后我将 gdb 可执行程序复制到 /usr/local/bin 中(使用 sudo cp),我很高兴看到它正常工作!
【讨论】:
gdb 版本 7.9.1-1 据***.com/questions/33772175/…报告在 Cygwin 中工作以上是关于Fortran在gdb中打印可分配数组的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 gdb 为 Fortran 程序打印数组大小(绑定)