在gdb中,如何反汇编地址的前一条指令?

在gdb中,如何反汇编地址的前一条指令?,gdb,disassembly,Gdb,Disassembly,我们知道,给定地址(含)后的拆解说明可以通过以下方式实现: x/5i address x/-5i address 哪一个将打印5条指令,但如何分解之前的指令 我正在调试JIT代码,所以类似的事情不起作用。我可以分解包含地址的随机范围,如: 但是这很尴尬,你会看到(坏)(希望不是在中间!)并且开始担心你没有得到正确的东西。我要找的是: x/5i address x/-5i address ,但上述方法不起作用 x/-5i地址不起作用 在x86或任何指令大小可变的体系结构上,通常无法知道上一

我们知道,给定地址(含)后的拆解说明可以通过以下方式实现:

x/5i address
x/-5i address
哪一个将打印5条指令,但如何分解之前的指令

我正在调试JIT代码,所以类似的事情不起作用。我可以分解包含地址的随机范围,如:

<>但是这很尴尬,你会看到<代码>(坏)(希望不是在中间!)并且开始担心你没有得到正确的东西。我要找的是:

x/5i address
x/-5i address
,但上述方法不起作用

x/-5i地址不起作用

在x86或任何指令大小可变的体系结构上,通常无法知道上一条指令的起始地址,因此无法可靠地反汇编上一条指令


我所做的(与您所做的非常相似):
x/15i$pc-35
。当您后退足够的字节数(此处为35)时,指令流反汇编通常会重新同步,您在开始时只会看到一个或两个
(错误)
指令,但
$pc
周围的指令看起来是正确的。

您可以从当前指令反汇编(
$pc
),然后试着从几个字节向后反汇编,直到你看到的第二条指令是正确的

(lldb) x/3i $pc
->  0xeccac5d4: 0x6913 ldr    r3, [r2, #0x10]
    0xeccac5d6: 0xaa02 add    r2, sp, #0x8
    0xeccac5d8: 0x4798 blx    r3
(lldb) x/3i $pc-1
    0xeccac5d3: 0x1368 asrs   r0, r5, #0xd
    0xeccac5d5: 0x0269 lsls   r1, r5, #0x9
    0xeccac5d7: 0x98aa ldr    r0, [sp, #0x2a8]
(lldb) x/3i $pc-2
    0xeccac5d2: 0x6802 ldr    r2, [r0]
->  0xeccac5d4: 0x6913 ldr    r3, [r2, #0x10]   <------ Correct!
    0xeccac5d6: 0xaa02 add    r2, sp, #0x8
(lldb)x/3i$pc
->0xeccac5d4:0x6913 ldr r3[r2,#0x10]
0xeccac5d6:0xaa02添加r2,sp,#0x8
0xeccac5d8:0x4798 blx r3
(lldb)x/3i$pc-1
0xeccac5d3:0x1368 asrs r0,r5,#0xd
0xeccac5d5:0x0269 lsls r1,r5,#0x9
0xeccac5d7:0x98aa ldr r0[sp,#0x2a8]
(lldb)x/3i$pc-2
0xeccac5d2:0x6802 ldr r2[r0]

->0xeccac5d4:0x6913 ldr r3,[r2,#0x10]因为一些对lldb的搜索可能会在这里结束:lldb中的等价物是
dis-s`$pc-35`