在Eclipse

时间:2017-09-10 14:00:44

标签: eclipse debugging fortran gdb gfortran

我正在使用Eclipse(Neon.3版本4.6.3)和gdb 7.11.1以及gfortran 5.4.0来调试可执行文件,但它似乎只能看到本地子例程变量和简单外部变量正常。考虑这个简化的例子:

module ext_class
  type extstruct_type
    integer(kind=4),          ::svar1
    integer(kind=4),          ::svar2
  end type extstruct_type

  integer(kind=4),               save :: extvar
  integer(kind=4), dimension(4), save :: extarray
  type (extstruct_type),         save :: extstruct
end

module mod
  subroutine foo(invar)
    use ext_class,          only : extvar, extarray, extstruct
    type (real::8), intent(in)  :: invar
    integer(kind=4)             :: i
    ...
    !Debugger breakpoint inserted here to check variable visibility
  end
end

Eclipse的变量列表将正确显示局部变量(i)和输入(invar),即使它们是模块/数组,但任何外部/全局变量(extvar, extarray, extstruct )不要出现在列表中。如果我尝试手动将它们键入“表达式”视图,则会出现无法评估缺失符号的错误:

  

报告了多个错误。

     

1)执行MI命令失败:   -var-create - * extvar来自调试器后端的错误消息:   -var-create:无法创建变量对象

     

2)无法创建变量对象

     

3)执行MI命令失败:   -data-evaluate-expression extvar来自调试器后端的错误消息:当前上下文中没有符号“extvar”。

     

4)执行MI命令失败:   -var-create - * extvar来自调试器后端的错误消息:   -var-create:无法创建变量对象

我发现编译器使用以下命令将这些全局变量存储在二进制可执行文件中的特殊符号:

nm <binaryname> | grep <modulename>

然后我可以通过输入以下内容来查看gdb中的全局模块成员:

print __<modulename>_MOD_<membername>

但是,它仅适用于模块中的简单成员类型!例如,我可以正确地看到整数成员:

print __ext_class_MOD_extvar
$1 = 0

对于静态整数数组,它不正确只打印第一个元素,从而阻止我查看任何成员数组的其他元素:

print __ext_class_MOD_extarray
$2 = 0
print __ext_class_MOD_extarray(1:4)
Cannot perform substring on this type

对于结构类型,它不正确仅打印第一个成员svar1),从而阻止我查看任何结构的其他成员:

print __ext_class_MOD_extstruct
$3 = 0
print __ext_class_MOD_extstruct%svar2
Attempt to extract a component of a value that is not a structure.

我读到here这可能实际上是gfortran的问题,而不是gdb,因为它在使用英特尔编译器时工作正常。编译时是否需要设置额外的标志?我已经使用-g -O0

1 个答案:

答案 0 :(得分:0)

  

编辑:此问题已在某些版本中得到解决(gfortran 6.2.0   在MacOS上使用gdb 7.12,但在Ubuntu中没有相同的版本)。   在尝试以下步骤之前,请更新到最新版本。

我发现了一种在Eclipse中也兼容的解决方法。似乎二进制文件不是跟踪有关变量类型的信息,而只是它们在内存中的地址。因此,可以通过将变量转换为正确的类型来查看变量。在Eclipse&#34;表达式&#34;中输入__ext_class_MOD_extstruct选项卡然后右键单击该条目并选择&#34;转换为键入...&#34;进入extstruct_type!或者,只需输入

即可
(extstruct_type)__ext_class_MOD_extstruct

表达&#34;&#34;标签。请注意,省略了星号(与C语法不同)。在gdb命令行中可以实现相同的目的,并且可以使用%分隔符按名称获取单个成员:

print ((extstruct_type)(__ext_class_MOD_extstruct)
$5 = (0, 0)
print ((extstruct_type)(__ext_class_MOD_extstruct)%svar2
$6 = 0

Eclipse&#34;表达&#34;选项&#34;显示为数组......&#34;失败,因为它似乎使用的C语法指针算法(*)与fortran的gdb不兼容,但它在手动省略星号时有效:

print __ext_class_MOD_extarray@4
$7 = (0, 0, 0, 0)
print __ext_class_MOD_extarray(2)
Cannot perform substring on this type

请注意,在某些版本中访问单个数组元素仍然失败。我们希望他们能够在新版本中一劳永逸地解决这个问题。