linux 如何使用gdb打印当前指令指针之前的指令?

rqenqsqc  于 2023-10-16  发布在  Linux
关注(0)|答案(3)|浏览(126)

如何使用gdb Linux打印当前指令指针之前的指令?

hxzsmxv2

hxzsmxv21#

在具有固定指令长度的处理器上(例如,SPARC)很简单:

(gdb) disas $pc-40,$pc+1

x86_64上,同样的方法也有效,但有一个警告:$pc-40可能会“着陆”在指令的中间,你会得到“垃圾”的前几个指令。然而,* 通常 * 的拆卸重新启动和尾部的输出是正确的。很少没有,然后你必须尝试$pc-41$pc-42

z9smfwbn

z9smfwbn2#

根据GDB文档的机器代码部分,当您为disassemble命令指定参数时,您可以在表达式中使用$pc,例如。

disas $pc-8, $pc
ccrfmcuu

ccrfmcuu3#

在GDB中,您可以使用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

相关问题