【发布时间】:2020-08-11 10:25:18
【问题描述】:
我知道我可以在 GDB 中将普通整数数组 data 的 n+1-th 元素打印为
print *((integer *)data + n)
但是如果data 是integer(INT64) 可分配数组,我如何才能正确打印出元素?
【问题讨论】:
我知道我可以在 GDB 中将普通整数数组 data 的 n+1-th 元素打印为
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/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
【讨论】:
No symbol "int64_t" in current context.。我在 Mac OS X 上使用gdb (GDB) 8.0.1,不知道是不是版本问题。
int64_t,请使用 long。或者如果long 不对应于您系统中的 64 位,则为其他内容。但它通常应该。
set language fortran)。或者在 C 模式下尝试我为 C 模式显示的那些命令。