Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从GDB中的Fortran多态派生数据类型打印值_Gdb_Fortran - Fatal编程技术网

从GDB中的Fortran多态派生数据类型打印值

从GDB中的Fortran多态派生数据类型打印值,gdb,fortran,Gdb,Fortran,我正在尝试使用gdb调试以下代码 (GNU gdb(Ubuntu/Linaro 7.4-2012.04-0ubuntu2.1)和gfortran (gcc版本4.6.3)。如果我启动gdb并单步执行子例程 有趣的是,我想在 模块类_测试。很容易打印变量“int”,该变量也是 在模块“class_test”中,使用命令:print class_test::int。 我的问题是,如果gdb 通过子程序的步骤有趣吗 !!类别定义 module class_test integer :: in

我正在尝试使用gdb调试以下代码 (GNU gdb(Ubuntu/Linaro 7.4-2012.04-0ubuntu2.1)和gfortran (gcc版本4.6.3)。如果我启动gdb并单步执行子例程 有趣的是,我想在 模块类_测试。很容易打印变量“int”,该变量也是 在模块“class_test”中,使用命令:print class_test::int。 我的问题是,如果gdb 通过子程序的步骤有趣吗

!!类别定义

  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

这是可能的,但我认为您无法避免手动检查内存。我采取了以下步骤:

(gdb) break class_test::fun
(gdb) run
(gdb) info args
这将显示与虚拟
This
关联的参数
结构的名称和地址:

this = ( 0x601080 <struct>, 0x400ae0 <__class_test_MOD___vtab_class_test_Mytype> )
其输出为

0x601080 <struct.1905>: 2       3       4       5
0x601080:23 4 5
显示
struct
按预期包含整数2、3、4和5


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

这可能只适用于较新版本的GDB,但根据?的说法,似乎您可以使用隐藏的
\u data
组件访问结构组件。类似于

print this%_data%int1
(对于像我这样的人来说,这个答案可能很有用,他们可以通过谷歌搜索轻松找到这篇文章,但无法轻松找到链接文章。链接文章主要讨论了一个基本无关的主题,但他提供了一个使用GDB在Fortran中打印类实例的成员变量的示例。我找不到其他任何内容例如在互联网上。)

我也只是在我自己的Fortran代码中尝试了一下,它似乎很管用

使用上面的示例代码(我不得不将伪变量“this”更改为“temp”,因为我在打印时出于某种原因一直在GDB中遇到seg.fault),下面是我从GDB(Ubuntu上的7.11.1版)得到的结果:

(gdb)打印温度
$1=(0x601070,0x4009c0)
(gdb)打印温度%\u数据
$2=(PTR至->(键入mytype
整数(种类=4)::int1
整数(种类=4)::int2
整数(种类=4)::int3
整数(种类=4)::int4
端类型(mytype))0x601070
(gdb)打印临时数据%int1
$3 = 2
(gdb)打印临时数据%int2
$4 = 3

这将是一个大问题。GDB可能不理解gfortran多态描述符。请尝试在某个地方找到它的结构。很抱歉,我似乎一直没有抓住要点。您能否尝试在回答中澄清这一点,以便其他人不会犯同样的错误?我添加了一些来自GDB的示例输出,以澄清我的观点;我希望这能有所帮助。请随意编辑这篇文章,以提高其清晰度——我认为你的Fortran词汇比我的更好、更一致。
print this%_data%int1
(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