GDB 单步调试汇编并显示下一条将被执行的指令。

7

使用gdb调试器,我可以执行什么命令来单步执行并显示下一个将执行的指令?我熟悉的windbg操作非常简单。

例如,我有以下功能,并且通过si逐步进入代码时,我想显示将要执行的下一个指令,而无需通过disassemble进行完整的反汇编。我该如何实现这一点?

Dump of assembler code for function isEven:
   0x0000000100000f20 <+0>: push   %rbp
   0x0000000100000f21 <+1>: mov    %rsp,%rbp
   0x0000000100000f24 <+4>: mov    $0x2,%eax
   0x0000000100000f29 <+9>: mov    %edi,-0x4(%rbp)
=> 0x0000000100000f2c <+12>:    mov    -0x4(%rbp),%edi
   0x0000000100000f2f <+15>:    mov    %eax,-0xc(%rbp)
   0x0000000100000f32 <+18>:    mov    %edi,%eax
   0x0000000100000f34 <+20>:    cltd
   0x0000000100000f35 <+21>:    mov    -0xc(%rbp),%edi
   0x0000000100000f38 <+24>:    idiv   %edi
   0x0000000100000f3a <+26>:    cmp    $0x0,%edx
   0x0000000100000f3d <+29>:    jne    0x100000f4f <isEven+47>
   0x0000000100000f43 <+35>:    movl   $0x1,-0x8(%rbp)
   0x0000000100000f4a <+42>:    jmpq   0x100000f56 <isEven+54>
   0x0000000100000f4f <+47>:    movl   $0x0,-0x8(%rbp)
   0x0000000100000f56 <+54>:    mov    -0x8(%rbp),%eax
   0x0000000100000f59 <+57>:    pop    %rbp
   0x0000000100000f5a <+58>:    retq
End of assembler dump.
(gdb)

那么关于文档或内置帮助,你有什么不明白的地方?你在简单的在线搜索中找到了什么? - too honest for this site
@Olaf,我实际上拥有GNU源码级调试器手册,并且已经使用它来确定如何单步执行等操作。然而,我没有看到关于如何显示下一条指令的任何信息。 - dcrearer
@Olaf,感谢你的鼓励。我找到了show disassemble-next-line和set disassemble-next-line on。 - dcrearer
我真心希望那个小小的踢并没有太多伤害:-) 我给你的问题投了反对票,但我会为你的自我回答点赞——这可能对我也有用。(只是对我来说从未那么重要,以至于我很少在汇编级别上进行深入调试。) - too honest for this site
1个回答

15

我发现下列指令序列可以完成我的目标。

(gdb) show disassemble-next-line
Debugger's willingness to use disassemble-next-line is off.
(gdb) set disassemble-next-line on
(gdb) show disassemble-next-line
Debugger's willingness to use disassemble-next-line is on.

谢谢Olaf!

(gdb) si
0x0000000100000f32  27      if(num % 2 == 0 )
   0x0000000100000f2c <isEven+12>:  8b 7d fc    mov    -0x4(%rbp),%edi
   0x0000000100000f2f <isEven+15>:  89 45 f4    mov    %eax,-0xc(%rbp)
=> 0x0000000100000f32 <isEven+18>:  89 f8   mov    %edi,%eax
   0x0000000100000f34 <isEven+20>:  99  cltd
   0x0000000100000f35 <isEven+21>:  8b 7d f4    mov    -0xc(%rbp),%edi
   0x0000000100000f38 <isEven+24>:  f7 ff   idiv   %edi
   0x0000000100000f3a <isEven+26>:  83 fa 00    cmp    $0x0,%edx
   0x0000000100000f3d <isEven+29>:  0f 85 0c 00 00 00   jne    0x100000f4f <isEven+47>

5
另一种实现大致相同结果的方法:display/4i $pc - Employed Russian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接