gdb / gfortran在7.2 / 4.7之后破裂

时间:2015-01-15 12:21:51

标签: gcc memory-management gdb fortran gfortran

我有三台机器,两台运行Linux,一台运行OS X Yosemite,使用不同版本的gfortrangdb。我的旧盒子上的gdb与分配的数组配合得很好,但是,较新版本的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上运行良好(不再维护)

[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)
$1 = (2, 5)
(gdb) p y(2,:)
$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>

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

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
$1 = (PTR TO -> ( integer(kind=4) (*,*))) 0x7fffffffe4f0
(gdb) p &x
$2 = (PTR TO -> ( integer(kind=4) (2,3))) 0x7fffffffe540
(gdb) p *((integer *) y)@6
$6 = (1, 4, 2, 5, 3, 6)

1 个答案:

答案 0 :(得分:1)

我认为回答这个问题会更好。实际上Fedora上的gdb带有一个补丁集http://pkgs.fedoraproject.org/cgit/gdb.git/,可以为Fortran代码调试可分配的数组。

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

不需要修补gfortran。