【问题标题】:GDB examine long double arrayGDB 检查长双精度数组
【发布时间】:2025-12-08 12:20:01
【问题描述】:

我正在尝试使用 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

(我知道为什么这个不起作用,因为 'g' 表示 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

【问题讨论】:

    标签: arrays assembly floating-point gdb x86-64


    【解决方案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}
    

    【讨论】:

    • (gdb) p (long double[3])array Invalid cast. 不幸的是我无法进行这样的演员。
    最近更新 更多