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

时间:2013-05-05 02:14:12

标签: gdb disassembly

我们知道在给定的地址(包括)之后反汇编指令可以通过以下方式实现:

x/5i address

将打印5条指令,但如何反汇编上一条指令?

我正在调试JIT代码,所以像disassembling a line这样的东西不起作用。我可以反汇编包含地址的随机范围,如:

disas address-10 address+10

但是这很尴尬,你会看到(bad)(希望不在中间!)并开始担心你没有得到正确的答案。我正在寻找的是:

x/-5i address

,但上面的工作没有成功。

2 个答案:

答案 0 :(得分:8)

  

x / -5i地址不起作用

在x86或任何具有可变指令大小的架构上,您通常无法知道上一条指令开始的地址,因此您无法可靠地反汇编先前的指令。

我的所作所为(与您的行为非常相似):x/15i $pc-35。当您退回足够数量的字节(此处为35)时,指令流反汇编通常会重新同步,您只能在开头看到一条或两条(bad)指令,但$pc周围的指令看起来是正确的。< / p>

答案 1 :(得分:0)

您可以从当前指令($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