如何使用 gdb linux 打印当前指令指针之前(之前)的指令?
在具有固定指令长度的处理器上(例如
SPARC
),这非常简单:
(gdb) disas $pc-40,$pc+1
在
x86_64
上,同样的方法也有效,但有一个警告:$pc-40
可能会在指令中间“着陆”,并且对于前几条指令,您会得到“垃圾”。但是,“通常”反汇编会重新同步,并且输出的尾部是正确的。很少没有,然后你必须尝试 $pc-41
或 $pc-42
。x /<N>i $pc
从当前程序计数器中反汇编一些指令。幸运的是,N 可以是任何数字,包括负数,因此,当 N 为 -1 时,您将得到上一条指令
>>> x /-1i $pc
0x8001040 <main>: xor %eax,%eax
>>> disas
Dump of assembler code for function main:
0x0000000008001040 <+0>: xor %eax,%eax
=> 0x0000000008001042 <+2>: ret
End of assembler dump.
必须使用行号信息进行编译,即:
gcc -g
参考:https://sourceware.org/gdb/onlinedocs/gdb/Memory.html