从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 通过子程序的步骤有趣吗 !!类别定义从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
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