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

问题描述 投票:0回答:3

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

x/5i address

它将打印 5 条指令,但是如何反汇编前面的指令?

我正在调试 JIT 代码,因此诸如 反汇编一行 之类的事情不起作用。我可以分解包含 address 的随机范围,例如:

disas address-10 address+10

但这非常尴尬,你会看到

(bad)
(希望不是在中间!)并开始担心你没有得到正确的东西。我正在寻找的是这样的:

x/-5i address

,但是上面的方法不起作用。

gdb disassembly
3个回答
10
投票

x/-5i 地址不起作用

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

我所做的(与你所做的非常相似):

x/15i $pc-35
。当您后退足够数量的字节(此处为 35)时,指令流反汇编通常会重新同步,您在开头只能看到一两个
(bad)
指令,但
$pc
周围的指令看起来是正确的。


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

0
投票

我正在寻找的是这样的:

x/-5i address

我不确定从什么时候开始,但这确实适用于 GBD 10。不过,您必须使用行号信息进行编译,即:使用

gcc -g
进行编译。

参考:https://sourceware.org/gdb/onlinedocs/gdb/Memory.html

更多信息请访问 https://stackoverflow.com/a/77204059/619330

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.