我试图使用gdb检查内存中的long double
数组是否可能?我不知道什么后缀使用x甚至p命令?
例如,我有(气体语法):
array: .tfloat 5, 6, 7
fldt array
fldt array+10
fldt array+20
并且在gdb中我能够直接从浮点堆栈打印这些值:
(gdb) p $st0
$4 = 7
(gdb) p $st1
$5 = 6
(gdb) p $st2
$6 = 5
但我找不到使用数组地址检查所有这些值的方法,如:
(gdb) x/4gf &array
0x4000b0 <array>: -1,4916681462400413e-154 8,0952656071088246e-320
0x4000c0 <array+16>: 5,3055561114210832e-315 1,3063763415981806e-9
(我知道为什么这个不起作用,因为&#39; g&#39;意味着8个字节)
我当然可以通过一些演员手动访问它们并解决这些问题。
(gdb) p *(long double*)(*(array))
$11 = 5
(gdb) p *(long double*)(*(array+10))
$12 = 6
(gdb) p *(long double*)(*(array+20))
$13 = 7
(gdb) p *(long double*)(*(array))+1
$21 = 6
(gdb) p *(long double*)(*(array))+2
$22 = 7
但是我希望我在文档中遗漏了一些内容,并且有一种更简单的方法来打印完整数组而不是打印每个元素,我的数组中有许多元素需要不时检查。
gdb --version
GNU gdb (Gentoo 7.7.1 p1) 7.7.1
答案 0 :(得分: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
$1 = {5, 6, 7}