gdb/gfortran 7.2/4.7 后损坏

gdb/gfortran broken after 7.2/4.7

我有三台机器,两台 运行 Linux 和一台 运行 OS X Yosemite gfortrangdbgdb 在我的旧盒子上可以很好地处理分配的数组,但是,较新版本的 gdb(7.2 之后)和 gfortran(4.7 之后)似乎无法检查可分配变量.

我的问题是:这是预期的行为还是有补丁可以使 gfortrangdb 像旧版本一样工作?

这是我测试过的小版本代码:

integer :: x(2,3)
integer, allocatable :: y(:,:)

allocate(y(2,3))

x = reshape([1,2,3,4,5,6], [2,3], order=[2,1])
y = reshape([1,2,3,4,5,6], [2,3], order=[2,1])

print *, 'x', transpose(x)
print *, 'y', transpose(y)

end

并且来自三台机器的结果

它在 Fedora 17 上的 4.7 上运行良好(不再维护)

[qlle@(none) ~]$ gdb --version | head -n1
GNU gdb (GDB) Fedora (7.4.50.20120120-54.fc17)
[qlle@(none) ~]$ gfortran --version | head -n1
GNU Fortran (GCC) 4.7.2 20120921 (Red Hat 4.7.2-2)

(gdb) i lo
x = (( 1, 4) ( 2, 5) ( 3, 6) )
y = (( 1, 4) ( 2, 5) ( 3, 6) )
(gdb) p y(:,2)
 = (2, 5)
(gdb) p y(2,:)
 = (4, 5, 6)
(gdb) show language 
The current source language is "auto; currently fortran".

但是,在 Mac 机器上通过 homebrew 使用最新版本,我得到的是 incomplete type

~/Downloads❯ gdb --version | head -n 1
GNU gdb (GDB) 7.8.1

~/Downloads❯ gfortran --version | head -n1
GNU Fortran (Homebrew gcc 4.9.2_1) 4.9.2

~/Downloads❯ gdb a.out
...
(gdb) break 9
Breakpoint 1 at 0x100000b41: file alloc.f90, line 9.
run
...
(gdb) info locals
x = (( 1, 4) ( 2, 5) ( 3, 6) )
y = <incomplete type>

更糟糕的是,在其他 Linux 框 4.8 (Ubuntu 14.04) 上,它似乎指向不正确的部分(堆栈而不是堆):

link@hyrule:~$ gdb --version | head -n1
GNU gdb (Ubuntu 7.7.1-0ubuntu5~14.04.2) 7.7.1
link@hyrule:~$ gfortran --version | head -n1
GNU Fortran (Ubuntu 4.8.2-19ubuntu1) 4.8.2
(gdb) i lo
x = (( 1, 4) ( 2, 5) ( 3, 6) )
y = (( 0) )
(gdb) p &y
 = (PTR TO -> ( integer(kind=4) (*,*))) 0x7fffffffe4f0
(gdb) p &x
 = (PTR TO -> ( integer(kind=4) (2,3))) 0x7fffffffe540
(gdb) p *((integer *) y)@6
 = (1, 4, 2, 5, 3, 6)

我觉得回答问题比较好。实际上 gdb 在 Fedora 上带有一个补丁集 http://pkgs.fedoraproject.org/cgit/gdb.git/ 可以调试 Fortran 代码的可分配数组。

为了让可分配数组在其他平台上工作,我们需要从特定分支重建 gdb,例如 Archer gdb 的 archer-jankratochvil-vla https://sourceware.org/gdb/wiki/ProjectArcher

虽然不需要修补 gfortran。