我正在尝试使用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
最佳答案 这是可能的,但我认为你不能避免手动检查内存.我采取了以下步骤:
(gdb) break class_test::fun
(gdb) run
(gdb) info args
这揭示了与虚拟关联的参数结构的名称和地址:
this = ( 0x601080 <struct>, 0x400ae0 <__class_test_MOD___vtab_class_test_Mytype> )
尝试打印甚至制表符完成结构会导致gdb对我来说是段错误.所以我使用(Fortran 2008)函数storage_size来发现这需要128位内存.打印从地址0x601080开始的四个4字节块的内容,格式为无符号整数:
(gdb) x/4u 0x601080
输出为
0x601080 <struct.1905>: 2 3 4 5
显示struct包含预期的整数2,3,4和5.
当然,如果派生类型包括各种数据类型甚至其他派生类型,这可能不是那么容易.