How do I modify NEON registers with LLDB commands?


#1

I was debugging an App when I met the following instructions:

0x0003409c         vcmpe.f64  d17, d16
0x000340a0         vmrs       APSR_nzcv, fpscr
0x000340a4         bpl        0x34100

I thought the 3 instructions were to:

  1. Compares two floating-point registers, or one floating-point register and zero. i.e. compares D17 and D16 by subtracting D16 from D17 (D17 - D16); Note that D16 & D17 are both NEON registers.
  2. Transfer contents from a NEON and VFP system register to an ARM register.
  3. Branch if N clear, i.e. the subtracting turns to be positive.

D17 and D16 were originally the same:

* thread #1: tid = 0x5bec9, 0x0011209c GJOfficeBuild`___lldb_unnamed_function1113$$GJOfficeBuild + 1056, queue = 'com.apple.main-thread', stop reason = breakpoint 4.1
    frame #0: 0x0011209c GJOfficeBuild`___lldb_unnamed_function1113$$GJOfficeBuild + 1056
GJOfficeBuild`___lldb_unnamed_function1113$$GJOfficeBuild:
->  0x11209c <+1056>: vcmpe.f64 d17, d16
    0x1120a0 <+1060>: vmrs   APSR_nzcv, fpscr
    0x1120a4 <+1064>: bpl    0x112100                  ; <+1156>
    0x1120a6 <+1066>: ldr    r0, [sp, #0xc]
(lldb) p $d17
(double) $27 = 1
(lldb) p $d16
(double) $28 = 1

I wanna branch at 0x1120a4 so I tried to set D17 to a much bigger value than D16:

(lldb) register write $d17 9
(lldb) p $d17
(double) $23 = 9
(lldb) p $d16
(double) $24 = 9
(lldb) register write $d17 6
(lldb) p $d17
(double) $25 = 6
(lldb) p $d16
(double) $26 = 6

And vice versa:

(lldb) register write $d16 0
(lldb) p $d17
(double) $29 = 0
(lldb) p $d16
(double) $30 = 0
(lldb) register write $d16 9
(lldb) p $d17
(double) $31 = 9
(lldb) p $d16
(double) $32 = 9

As you can see, the 2 registers changed together. Why was that happening? And how do I modify D17 without changing D16?

Thanks,
snakeninny


#2

我也遇到了这个问题,我想修改V18的值
(lldb) p $v18
(unsigned char attribute((ext_vector_type(16)))) $0 = (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00)
是一个向量类型的值,试了很多方法lldb都不认,修改不成功