我正在尝试调试在OS X El Capitan (10.11.6)
上使用可分配数组的fortran程序。该程序使用gfortran
(GNU Fortran (GCC) 8.1.0
)编译,我正在使用gdb
(GNU gdb (GDB) 8.1
)。 gfortran
和gdb
都是根据来源构建的(说明:gfortran,gdb)。我的问题是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
的大小。
在具有gdb
(GNU gdb (Ubuntu 8.0.1-0ubuntu1) 8.0.1
)和gfortran
(GNU 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
的大小和内容。在Ubuntu
和OS 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
) 。以前的建议是:
lldb
,虽然其他人(包括我自己)发现这是does not work。(gdb) print *((real_8 *) tab)@10
,以查看可分配数组tab
的10个元素(我真的想避免这种情况,因为除了最简单的情况之外,它变得复杂)< / LI>
jankratochvil-vla
分支
我在gdb
的最新版本中找不到Project Archer OS X
分支的工作版本的示例。我自己构建 Project Archer 分支的努力仍会导致gdb
无法正确打印出可分配数组。
好像gdb
从例如{ homebrew
also has this problem。因此,如果有人可以就如何在gdb
(或更新OS X El Capitan
,如果需要)上获取或构建MacOS
的版本可以给我一些建议,可以打印来自{{1的可分配数组我真的很感激。或者,任何关于为什么不可能的解释也会有所帮助。