首页 > 解决方案 > 如何在 GDB 中打印可分配的 fortran int64 数组

问题描述

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

print *((integer *)data + n)

data但是,如果是integer(INT64)可分配数组,如何正确打印元素?

标签: fortrangdbgfortran

解决方案


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

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


你真的可以做

 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

数据库:

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/stackoverflow/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)
$1 = 6
(gdb) print *((int64_t *)(&data) + n)
$2 = 6
(gdb) set language c
Warning: the current language does not match this frame.
(gdb) print *((int64_t *)data + n)
$3 = 6
(gdb) print *((long *)data + n)
$4 = 6

推荐阅读