gdb:打印AArch64高级SIMD向量寄存器(是否可能?)

5

我正在尝试在汇编代码中进行调试,以检查高级SIMD向量寄存器中的值。为此,我运行gdb并在我的指令内设置断点,运行layout asm并使用si逐步执行我的指令。然而,当我到达所需的指令时,例如p v16,它没有打印出该寄存器内部的值,并给了我一个类似以下的错误:

0x4009d0 <Montmul512+80>        umull2 v16.2d, v15.4s, v7.s[3]                                                                         │
      >0x4009d4 <Montmul512+84>        umull2 v17.2d, v13.4s, v7.s[3]                                                                         │
       │0x4009d8 <Montmul512+88>        umull2 v18.2d, v14.4s, v7.s[3]                                                                         │
       │0x4009dc <Montmul512+92>        umull2 v19.2d, v12.4s, v7.s[3]                                                                         │
       │0x4009e0 <Montmul512+96>        umull  v20.2d, v15.2s, v7.s[3]                                                                         │
       │0x4009e4 <Montmul512+100>       umull  v21.2d, v13.2s, v7.s[3]                                                                         │
       │0x4009e8 <Montmul512+104>       umull  v22.2d, v14.2s, v7.s[3]                                                                         │
       └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
    (gdb) print v16
    print v16
    No symbol "v16" in current context.

我在调试汇编代码方面没有任何经验,所以这个问题对许多人来说可能非常简单。


2
通常在gdb中,寄存器名称以$开头。我不知道AArch64,但可以尝试使用p $v16命令。或者查看info regs命令。 - Tom Tromey
3个回答

4
您也可以像下面的示例一样从gdb中打印向量寄存器。
(gdb) p $v0
$101 = {d = {f = {1.2672947890318689e-279, 7.7486181465248912e-304}, u = {434317018741670663, 72340181461566213}, s = {434317018741670663, 72340181461566213}}, s = {
    f = {2.42644275e-35, 2.53914328e-35, 3.79131591e-37, 2.36942839e-38}, u = {100729607, 101122311, 50397957, 16843011}, s = {100729607, 101122311, 50397957, 
      16843011}}, h = {u = {775, 1537, 263, 1543, 773, 769, 259, 257}, s = {775, 1537, 263, 1543, 773, 769, 259, 257}}, b = {u = {7, 3, 1, 6, 7, 1, 7, 6, 5, 3, 1, 3, 
      3, 1, 1, 1}, s = {7, 3, 1, 6, 7, 1, 7, 6, 5, 3, 1, 3, 3, 1, 1, 1}}, q = {u = {0x01010103030103050607010706010307}, s = {0x01010103030103050607010706010307}}}

打印不同的车道/元素:

(gdb) p $v0.q
$102 = {u = {0x01010103030103050607010706010307}, s = {0x01010103030103050607010706010307}}
(gdb) p $v0.d
$103 = {f = {1.2672947890318689e-279, 7.7486181465248912e-304}, u = {434317018741670663, 72340181461566213}, s = {434317018741670663, 72340181461566213}}
(gdb) p $v0.s
$104 = {f = {2.42644275e-35, 2.53914328e-35, 3.79131591e-37, 2.36942839e-38}, u = {100729607, 101122311, 50397957, 16843011}, s = {100729607, 101122311, 50397957, 
    16843011}}
(gdb) p $v0.q.s
$105 = {0x01010103030103050607010706010307}
(gdb) p $v0.d.s
$106 = {434317018741670663, 72340181461566213}
(gdb) p $v0.d.s[1]
$107 = 72340181461566213

根据我的经验,如果你没有非常大的显示器,使用-tui、layout asm和layout reg选项往往会显得拥挤。因此,如果您在gdb中执行下面的命令,将很难看到所有的simd寄存器。由于我比较懒,通常使用缩写。当gdb无法理解您想要的命令时,它会让您知道。

(gdb) wh reg +1
(gdb) tu reg next

3

尝试使用info vector查看所有高级SIMD寄存器(以不同的布局打印),或者使用info all-registers v16仅查看v16的内容。


1
你可能还可以使用 layout reg,以及 tui reg vectortui reg next 在文本 UI 布局中循环切换寄存器窗口模式。 - Peter Cordes

3

ARMv7

这是类似于在https://dev59.com/ZpTfa4cB1Zd3GeqPOUey#38538116中提到的ARMv8的ARMv7行为,使用QEMU v3.0.0构建自用户模式+ GDB 8.2 Ubuntu 16.04。

加载后:

最初的回答:

1.5, 2.5, 3.5, 4.5

将其输入到q0中,我们得到:

(gdb) p $q0
$3 = {
  u8 = {[0] = 0, [1] = 0, [2] = 192, [3] = 63, [4] = 0, [5] = 0, [6] = 32, [7] = 64, [8] = 0, [9] = 0, [10] = 96, [11] = 64, [12] = 0, [13] = 0, [14] = 144, [15] = 64}, 
  u16 = {[0] = 0, [1] = 16320, [2] = 0, [3] = 16416, [4] = 0, [5] = 16480, [6] = 0, [7] = 16528}, 
  u32 = {[0] = 1069547520, [1] = 1075838976, [2] = 1080033280, [3] = 1083179008}, 
  u64 = {[0] = 4620693218751676416, [1] = 4652218416153755648}, 
  f32 = {[0] = 1.5, [1] = 2.5, [2] = 3.5, [3] = 4.5}, 
  f64 = {[0] = 8.0000018998980522, [1] = 1024.0002455711365}
}

并且:

(gdb) p $q0.f32
$5 = {[0] = 1.5, [1] = 2.5, [2] = 3.5, [3] = 4.5}

测试设置

info register中的错误

当我尝试在这个设置(v7或v8)中使用info vectorinfo register,如https://dev59.com/ZpTfa4cB1Zd3GeqPOUey#35552000所述,似乎存在一个错误,其中浮点表示被转换为整数,请参见:https://reverseengineering.stackexchange.com/questions/8992/floating-point-registers-on-arm/20623#20623

SVE

在QEMU上还未实现,参见:如何使用GNU GAS或LLVM汇编ARM SVE指令并在QEMU上运行?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接