首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在gdb中,我如何分解以前的地址指令?

在gdb中,我如何分解以前的地址指令?
EN

Stack Overflow用户
提问于 2013-05-05 02:14:12
回答 2查看 4.5K关注 0票数 9

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

代码语言:javascript
复制
x/5i address

哪个将打印5条指令,但我如何解压缩以前的指令?

我正在调试JIT代码,这样像disassembling a line这样的东西就不能工作了。我可以拆解包含地址的随机范围,例如:

代码语言:javascript
复制
disas address-10 address+10

但这是非常尴尬的,您将看到(bad) (希望不是在中间!)开始担心你做得不对。我要找的是:

代码语言:javascript
复制
x/-5i address

,但上面的方法行不通。

EN

回答 2

Stack Overflow用户

发布于 2013-05-05 15:05:13

x/-5i地址不工作

在x86或任何具有可变指令大小的体系结构上,通常无法知道以前指令开始的地址,因此无法可靠地分解以前的指令。

我所做的(非常类似于您所做的):x/15i $pc-35。当您后退足够多的字节(这里有35个字节)时,指令流反汇编通常会重新同步,在开始时只看到一个或两个(bad)指令,但是围绕$pc的指令看起来是正确的。

票数 10
EN

Stack Overflow用户

发布于 2017-08-05 18:42:31

您可以从当前指令($pc)中反汇编,然后尝试从几个字节向后反汇编,直到您看到的第二个指令正确为止。

代码语言:javascript
复制
(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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16380747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档