在Mac OS X上使用gdb调试gfortran可分配数组

时间:2018-05-22 13:45:56

标签: macos fortran gdb gfortran osx-elcapitan

我正在尝试调试在OS X El Capitan (10.11.6)上使用可分配数组的fortran程序。该程序使用gfortranGNU Fortran (GCC) 8.1.0)编译,我正在使用gdbGNU gdb (GDB) 8.1)。 gfortrangdb都是根据来源构建的(说明:gfortrangdb)。我的问题是gdb无法正确识别/显示可分配数组。

这是一个old and known问题,似乎已在最近的Linux发行版中得到修复。所以我怀疑这只是OS X上的一个问题。接下来,我将展示一个最小,完整且可验证的示例。

问题

测试程序名为test.f90:

program ex
  implicit none
  integer, parameter :: dp = kind(1.d0)
  integer :: i
  real(kind=dp),allocatable :: tab(:)
  real(kind=dp) :: tab2(10)
  allocate(tab(1:10))
  do i=1,10
     tab(i)=real(i,kind=dp)
     tab2(i)=tab(i)
  end do
  write(*, '(*(f3.0,1x))') tab
  write(*, '(*(f3.0,1x))') tab2
end program ex

使用编译:

gfortran -g test.f90 -o test

在可执行文件上调用gdb

gdb ./test
(gdb) b test.f90:12
(gdb) run
(gdb) info locals
i = 11
tab = ()
tab2 = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
(gdb) p &tab
$1 = (PTR TO -> ( real(kind=8) (*))) 0x7fff5fbff930
(gdb) p &tab2
$2 = (PTR TO -> ( real(kind=8) (10))) 0x7fff5fbff8e0

请注意,在gdb中无法正确打印/识别可分配变量tab的大小。

预期结果

在具有gdbGNU gdb (Ubuntu 8.0.1-0ubuntu1) 8.0.1)和gfortranGNU Fortran (Ubuntu 7.2.0-8ubuntu3.2) 7.2.0)的Ubuntu虚拟机上,使用与上面相同的命令进行编译和调试,给出预期结果:

(gdb) info locals
i = 11
tab = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
tab2 = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
(gdb) p &tab
$1 = (PTR TO -> ( real(kind=8) (10))) 0x55555575a240
(gdb) p &tab2
$2 = (PTR TO -> ( real(kind=8) (10))) 0x7fffffffd7f0

因此,在Ubuntu上,gdb正确报告与tab相同的可分配数组tab2的大小和内容。在UbuntuOS X上,实际程序输出与预期相同,即:

./test
1.  2.  3.  4.  5.  6.  7.  8.  9. 10.
1.  2.  3.  4.  5.  6.  7.  8.  9. 10.

我尝试了什么

此网站上已有许多相关问题,但我找不到任何可提供有效解决方案的问题(在{em>最近的 OS X版本上,如El Capitan) 。以前的建议是:

我在gdb的最新版本中找不到Project Archer OS X分支的工作版本的示例。我自己构建 Project Archer 分支的努力仍会导致gdb无法正确打印出可分配数组。

好像gdb从例如{ homebrew also has this problem。因此,如果有人可以就如何在gdb(或更新OS X El Capitan,如果需要)上获取或构建MacOS的版本可以给我一些建议,可以打印来自{{1的可分配数组我真的很感激。或者,任何关于为什么不可能的解释也会有所帮助。

0 个答案:

没有答案