gdb/gfortran 7.2/4.7 后损坏
gdb/gfortran broken after 7.2/4.7
我有三台机器,两台 运行 Linux 和一台 运行 OS X Yosemite gfortran
和 gdb
。 gdb
在我的旧盒子上可以很好地处理分配的数组,但是,较新版本的 gdb
(7.2 之后)和 gfortran
(4.7 之后)似乎无法检查可分配变量.
我的问题是:这是预期的行为还是有补丁可以使 gfortran
、gdb
像旧版本一样工作?
这是我测试过的小版本代码:
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。
我有三台机器,两台 运行 Linux 和一台 运行 OS X Yosemite gfortran
和 gdb
。 gdb
在我的旧盒子上可以很好地处理分配的数组,但是,较新版本的 gdb
(7.2 之后)和 gfortran
(4.7 之后)似乎无法检查可分配变量.
我的问题是:这是预期的行为还是有补丁可以使 gfortran
、gdb
像旧版本一样工作?
这是我测试过的小版本代码:
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。