GDB 检查长双精度数组

GDB examine long double array

我正在尝试使用 gdb 检查内存中的 long double 数组是否可行?我不知道 x 甚至 p 命令使用什么后缀? 例如我有(气体语法):

array: .tfloat 5, 6, 7
fldt array
fldt array+10
fldt array+20

并且在 gdb 中,我能够直接从浮点堆栈打印这些值:

(gdb) p $st0
 = 7
(gdb) p $st1
 = 6
(gdb) p $st2
 = 5

但我无法找到一种仅使用数组地址来检查所有这些值的方法,例如:

(gdb) x/4gf &array
0x4000b0 <array>:   -1,4916681462400413e-154    8,0952656071088246e-320
0x4000c0 <array+16>:    5,3055561114210832e-315 1,3063763415981806e-9

(我知道为什么这个不行,因为'g'表示8个字节)

我当然可以通过一些强制转换和变通方法手动访问这些内容。

(gdb) p *(long double*)(*(array))
 = 5
(gdb) p *(long double*)(*(array+10))
 = 6
(gdb) p *(long double*)(*(array+20))
 = 7
(gdb) p *(long double*)(*(array))+1
 = 6
(gdb) p *(long double*)(*(array))+2
 = 7

但我希望我在文档中遗漏了一些东西,并且有一种更简单的方法可以打印出完整的数组而不是打印每个元素,我有一个包含更多元素的数组需要不时检查。

gdb --version
GNU gdb (Gentoo 7.7.1 p1) 7.7.1

问题是,由于填充,long double 默认为 96 位,显然 gdb 只能理解该格式。实际精度是 80 位,这就是为什么你可以一个一个地打印它们,但大小显然会影响下一项在数组中的开始位置。

作为解决方法,您也可以添加该填充,或者编写一个 gdb 脚本来为您迭代元素。

array: .tfloat 5
.byte 0,0
.tfloat 6
.byte 0,0
.tfloat 7
.byte 0,0
(gdb) p (long double[3])array
 = {5, 6, 7}