GDB 可以用于在 Fortran 90 中打印派生类型的可分配数组的值吗? [复制]
Posted
技术标签:
【中文标题】GDB 可以用于在 Fortran 90 中打印派生类型的可分配数组的值吗? [复制]【英文标题】:Can GDB be used to print values of allocatable arrays of a derived type in Fortran 90? [duplicate] 【发布时间】:2013-05-03 02:24:47 【问题描述】:我在 Fortran90 程序中有以下数据结构:
TYPE derivedType
CHARACTER(100) :: name = ' '
INTEGER :: type = 0
REAL(KIND(1.0D0)) :: property = 0.0
END TYPE derivedType
TYPE (derivedType), ALLOCATABLE, DIMENSION(:) :: arrayOfDerivedTypes
当我尝试在 GDB 中调试和打印值时:
(gdb) p arrayOfDerivedTypes(1)%name
我得到无意义的值(通常是零、正斜杠和字母的字符串)或完全错误的值(如 arrayOfDerivedTypes(1)%name = 9,当我知道它是 = 2 时)。如何让 GDB 打印正确的值?
背景
我知道:
这个错误:http://sourceware.org/bugzilla/show_bug.cgi?id=9395 这个GDB分支:http://sourceware.org/gdb/wiki/ProjectArcher 还有这篇关于打印可分配数组的博文:http://numericalnoob.blogspot.be/2012/08/fortran-allocatable-arrays-and-pointers.html我不想麻烦编译一个单独的 GDB 分支来测试它是否能解决这个问题,如果有人已经知道它不会或者是否有更好的解决方案可用。
我很难想象目前还没有解决方案。 fortran 社区还没有更好的免费调试器解决方案吗?
【问题讨论】:
【参考方案1】:您使用的是哪个版本的 gdb 和 fortran 编译器(gfortran?)? 因为我没有问题
gdb - GNU gdb (GDB) Red Hat Enterprise Linux (7.2-56.el6) gfortran - GNU Fortran (GCC) 4.4.6 20120305(红帽 4.4.6-4)这是测试程序:
program test
implicit none
TYPE derivedType
CHARACTER(100) :: name = ' '
INTEGER :: type = 0
REAL(KIND(1.0D0)) :: property = 0.0
END TYPE derivedType
TYPE (derivedType), ALLOCATABLE, DIMENSION(:) :: arrayOfDerivedTypes
allocate(arrayOfDerivedTypes(10))
write(6,*) arrayOfDerivedTypes(1)%type
end program test
我把它编译成
gfortran -o test -g -O0 -Wall test.f90
然后启动调试器,设置断点并运行
$ gdb test
(gdb) break test.f90:14
Breakpoint 1 at 0x402c8a: file test.f90, line 14.
(gdb) r
[Thread debugging using libthread_db enabled]
Breakpoint 1, test () at test.f90:14
14 write(6,*) arrayOfDerivedTypes(1)%type
(gdb) p arrayOfDerivedTypes
$3 = (( ' ' <repeats 100 times>, 0, 0 ), ( ' ' <repeats 100 times>, 0, 0 ), ( ' ' <repeats 100 times>, 0, 0 ), ( ' ' <repeats 100 times>, 0, 0 ), ( ' ' <repeats 100 times>, 0, 0 ), ( ' ' <repeats 100 times>, 0, 0 ), ( ' ' <repeats 100 times>, 0, 0 ), ( ' ' <repeats 100 times>, 0, 0 ), ( ' ' <repeats 100 times>, 0, 0 ), ( ' ' <repeats 100 times>, 0, 0 ))
(gdb) p arrayOfDerivedTypes(1)
$4 = ( ' ' <repeats 100 times>, 0, 0 )
(gdb) p arrayOfDerivedTypes(1)%property
$5 = 0
(gdb) p arrayOfDerivedTypes(1)%name
$6 = ' ' <repeats 100 times>
我可以看到一切。
还有http://brulermavie.org/2012/02/how-to-debug-fortran-programs-using-gdb/ 对我没有帮助,因为我没有看到问题。
【讨论】:
我相信 Red Hat 自带了 Archer GDB,这是我上面提到的 GDB 的一个分支。很高兴知道调试可以在 Linux 中工作,但我很难让它在其他操作系统上工作。 链接brulermavie.org/2012/02/how-to-debug-fortran-programs-using-gdb已失效。【参考方案2】:我知道可能答案有点不对,但 Sun studio (sdb) 和 intel fortran 也带有调试器
【讨论】:
以上是关于GDB 可以用于在 Fortran 90 中打印派生类型的可分配数组的值吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
有没有一种方法可以在100到1000个索引的范围内打印长数组到GDB中的txt文件? (调试Fortran代码)
如何使用 gdb 为 Fortran 程序打印数组大小(绑定)
为啥 Inquire pos 在 Fortran 90 中返回 0