2013-05-05 154 views
4

我們知道,一個給定的地址後,拆卸指示(含)可以通過類似實現:在gdb中,我如何反彙編以前的地址指令?

x/5i address 

,它將打印5分的說明,但我如何拆卸之前的指令?

我在調試JIT代碼,所以像disassembling a line這樣的東西不起作用。 (中希望不會!)

disas address-10 address+10 

但是這是非常尷尬的,你會看到(bad)並開始擔心你沒有得到正確的事情:我可以拆解內含地址像一個隨機範圍。我正在尋找的東西是這樣的:

x/-5i address 

,但上述不起作用。

回答

5

X/-5i地址不起作用

在x86上,或具有可變指令長度的任何架構,可以不是一般知道前一條指令的起始地址,等等你不能可靠地反彙編先前的指令。

我該怎麼做(與你所做的非常相似):x/15i $pc-35。當您返回足夠數量的字節(此處爲35)時,指令流反彙編通常會重新同步,您在開始處僅看到一條或兩條(bad)指令,但$pc附近的指令看起來正確。

+0

由於一些搜索的LLDB可能在這裏結束了:在LLDB相當於是'DIS -s \'$ PC-35 \''。 – 2017-01-05 11:12:54

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