在GDB中打印Fortran多态导出数据类型中的值

时间:2014-05-23 19:13:44

标签: gdb fortran

我正在尝试使用gdb调试以下代码 (GNU gdb(Ubuntu / Linaro 7.4-2012.04-0ubuntu2.1)和gfortran (gcc-Version 4.6.3)。如果我启动gdb并逐步执行子例程 好玩,我想打印衍生类型的变量" mytype"内 模块class_test。很容易打印变量" int"那也是 在模块内" class_test"使用命令:print class_test :: int。 我的问题是如何在gdb中打印变量int1,int2 ... int4 逐步完成子程序的乐趣?

!!班级定义

  module class_test


 integer :: int = 1


 type, public :: mytype

    private

    integer :: int1  = 2

    integer :: int2  = 3

    integer :: int3  = 4

    integer :: int4  = 5

  contains


  procedure, pass(this) :: fun

  end type mytype

  contains

  subroutine fun ( this )

  class(mytype) :: this

  write (*,*) "subroutine" 

  end subroutine fun

  end module class_test


  !! Program
  program test 

 use class_test

 type(mytype) :: struct

 write (*,*) "whateveryouwant"

 call struct%fun()


  end program

2 个答案:

答案 0 :(得分:2)

这可能只适用于较新版本的GDB,但根据Pretty print Fortran dynamic type in gdb ?,您似乎可以使用隐藏的_data组件来访问结构组件。像

这样的东西
print this%_data%int1

(对于像我这样的人来说,这个答案可能很有用,因为我很容易从Google搜索中找到这个帖子,但却无法轻易找到链接的帖子。链接的帖子主要讨论了一个主要不相关的主题,但他提供了一个例子。使用GDB在Fortran中打印出类实例的成员变量。我无法在Internet上找到这样的任何其他示例。)

我也尝试过我自己的Fortran代码,它似乎有效。

使用上面的示例代码(我必须将虚拟变量“this”更改为“temp”,因为当我尝试打印时,由于某些原因我在GDB中遇到了一个seg。错误),这是我从GDB获得的内容(Ubuntu上的版本7.11.1):

(gdb) print temp
$1 = ( 0x601070 <struct>, 0x4009c0 <__class_test_MOD___vtab_class_test_Mytype> )
(gdb) print temp%_data
$2 = (PTR TO -> ( Type mytype
integer(kind=4) :: int1
integer(kind=4) :: int2
integer(kind=4) :: int3
integer(kind=4) :: int4
End Type mytype )) 0x601070 <struct>
(gdb) print temp%_data%int1
$3 = 2
(gdb) print temp%_data%int2
$4 = 3

答案 1 :(得分:1)

有可能,但我认为你不能避免手动检查内存。我采取了以下步骤:

(gdb) break class_test::fun
(gdb) run
(gdb) info args

这会显示与虚拟struct相关联的参数this的名称和地址:

this = ( 0x601080 <struct>, 0x400ae0 <__class_test_MOD___vtab_class_test_Mytype> )

尝试打印甚至制表完成struct会导致gdb对我进行段错误。所以我使用(Fortran 2008)函数storage_size来发现this需要128位内存。打印从地址0x601080开始的四个4字节块的内容,格式为无符号整数:

(gdb) x/4u 0x601080

输出为

0x601080 <struct.1905>: 2       3       4       5

显示struct按预期包含整数2,3,4和5。

当然,如果您的派生类型包含各种数据类型甚至其他派生类型,这可能并不容易。