【问题标题】:In gdb, how do I disassemble the previous instruction of an address?在gdb中,如何反汇编一个地址的前一条指令?
【发布时间】:2013-05-05 02:14:12
【问题描述】:

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

x/5i address

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

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

disas address-10 address+10

但这很尴尬,你会看到(bad)(希望不是在中间!)并开始担心你做错了什么。我正在寻找的是这样的:

x/-5i address

,但是上面的行不通。

【问题讨论】:

    标签: gdb disassembly


    【解决方案1】:

    x/-5i 地址不起作用

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

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

    【讨论】:

    • 由于某些对 lldb 的搜索可能会在这里结束:lldb 中的等价物是 dis -s `$pc-35`。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多