如何在 GDB 中打印可分配的 Fortran int64 数组

How to print allocatable fortran int64 array in GDB

我知道我可以在 GDB 中将普通整数数组 data 的第 n+1 个元素打印为

print *((integer *)data + n)

但是如果 data 是一个 integer(INT64) 可分配数组,我怎样才能正确打印出元素?

注意:一些较旧的 GDB 版本或在某些不幸的操作系统或发行版中使用的分支可能无法正确支持可分配数组。在那种情况下使用 C 语法。

如果旧 GDB 无法识别 int64_t,请使用 long 或对应于 64 位整数的任何旧 C 类型。


你真的可以做到

 print data(n+1)

正在使用

 print *((integer *)data + n)

是C模式的GDB语法,在Fortran模式下真的很简单

如果你真的想要复杂的C语法,你甚至可以在Fortran模式下使用它,它是

 print *((int64_t *)(&data) + n)

在C模式下(set langauge c之后),也可以使用

print *((int64_t *)data + n)

这个在 Fortran 模式下不起作用 (Cannot access memory at address 0x29)。


示例:

use iso_fortran_env

integer(int64), allocatable :: data(:)

integer :: n

data = [(i, i=1, 100)]

n = 5

continue

end

gdb:

GNU gdb (GDB; openSUSE Leap 15.1) 8.3.1
...
(gdb) break int64.f90:9
Breakpoint 1 at 0x4005ec: file int64.f90, line 9.
(gdb) run
Starting program: /home/lada/f/testy/Whosebug/a.out 

Breakpoint 1, MAIN__ () at int64.f90:9
9       n = 5
Missing separate debuginfos, use: zypper install libgcc_s1-gcc10-debuginfo-10.1.1+git68-lp151.27.1.x86_64 libquadmath0-gcc10-debuginfo-10.1.1+git68-lp151.27.1.x86_64
(gdb) step
13      end
(gdb) print data(n+1)
 = 6
(gdb) print *((int64_t *)(&data) + n)
 = 6
(gdb) set language c
Warning: the current language does not match this frame.
(gdb) print *((int64_t *)data + n)
 = 6
(gdb) print *((long *)data + n)
 = 6