fortran - 如何在 GDB 中打印可分配的 fortran int64 数组
问题描述
我知道我可以在 GDB 中将n+1
普通整数数组的第 -th 个元素打印为data
print *((integer *)data + n)
data
但是,如果是integer(INT64)
可分配数组,如何正确打印元素?
解决方案
注意:某些不幸的操作系统或发行版中使用的一些较旧的 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
推荐阅读
- c++ - Boost.Hana:将值的元组转换为 constexpr 上下文中相应类型的元组
- listview - ListView 获取孩子的维度
- r - read.csv 是如何工作的?如果我有一个包含不同列的数据集怎么办?
- c# - 发送一个填充特殊字符的字节数组
- php - 在 Crostini 中测试 Google 认证的应用程序
- c# - 无法将可解构类型隐式转换为元组
- json - 日期字段上的 Elasticsearch 范围查询总是给出空结果
- terminal - 如何通过单击在终端中完全打开可执行文件
- javascript - 图片的src为base64时,图片的保存名称从何而来
- javascript - 自动点击网站上的 500 多个链接