如何使用gdb Linux打印当前指令指针之前的指令?
hxzsmxv21#
在具有固定指令长度的处理器上(例如,SPARC)很简单:
SPARC
(gdb) disas $pc-40,$pc+1
在x86_64上,同样的方法也有效,但有一个警告:$pc-40可能会“着陆”在指令的中间,你会得到“垃圾”的前几个指令。然而,* 通常 * 的拆卸重新启动和尾部的输出是正确的。很少没有,然后你必须尝试$pc-41或$pc-42。
x86_64
$pc-40
$pc-41
$pc-42
z9smfwbn2#
根据GDB文档的机器代码部分,当您为disassemble命令指定参数时,您可以在表达式中使用$pc,例如。
disassemble
$pc
disas $pc-8, $pc
ccrfmcuu3#
在GDB中,您可以使用x /<N>i $pc从当前程序计数器中反汇编一些指令。幸运的是,N可以是任何数字,包括负数,所以,当N为-1时,你得到了前面的指令:
x /<N>i $pc
>>> 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
gcc -g
与其他回复不同,即使您不知道前一条指令的大小,这也可以工作。参考:https://sourceware.org/gdb/onlinedocs/gdb/Memory.html
3条答案
按热度按时间hxzsmxv21#
在具有固定指令长度的处理器上(例如,
SPARC
)很简单:在
x86_64
上,同样的方法也有效,但有一个警告:$pc-40
可能会“着陆”在指令的中间,你会得到“垃圾”的前几个指令。然而,* 通常 * 的拆卸重新启动和尾部的输出是正确的。很少没有,然后你必须尝试$pc-41
或$pc-42
。z9smfwbn2#
根据GDB文档的机器代码部分,当您为
disassemble
命令指定参数时,您可以在表达式中使用$pc
,例如。ccrfmcuu3#
在GDB中,您可以使用
x /<N>i $pc
从当前程序计数器中反汇编一些指令。幸运的是,N可以是任何数字,包括负数,所以,当N为-1时,你得到了前面的指令:对于上下文(程序计数器位于以
=>
开头的行):**注意:**必须使用行号信息进行编译,即:
gcc -g
与其他回复不同,即使您不知道前一条指令的大小,这也可以工作。
参考:https://sourceware.org/gdb/onlinedocs/gdb/Memory.html