我正在尝试使用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
答案 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。
当然,如果您的派生类型包含各种数据类型甚至其他派生类型,这可能并不容易。