Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C GDB单步汇编并显示将要执行的下一条指令。_C_Debugging_Gdb - Fatal编程技术网

C GDB单步汇编并显示将要执行的下一条指令。

C GDB单步汇编并显示将要执行的下一条指令。,c,debugging,gdb,C,Debugging,Gdb,使用gdb debbuger,我可以执行什么命令来执行单个步骤并显示将要执行的下一条指令?我熟悉windbg,它的操作非常简单 例如,我有下面的函数,当我通过si进入代码时,我想显示下一条将要执行的指令,而不必通过反汇编进行完整的反汇编。我怎样才能做到这一点 Dump of assembler code for function isEven: 0x0000000100000f20 <+0>: push %rbp 0x0000000100000f21 <+1&g

使用gdb debbuger,我可以执行什么命令来执行单个步骤并显示将要执行的下一条指令?我熟悉windbg,它的操作非常简单

例如,我有下面的函数,当我通过si进入代码时,我想显示下一条将要执行的指令,而不必通过反汇编进行完整的反汇编。我怎样才能做到这一点

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)
函数isEven的汇编程序代码转储: 0x0000000100000f20:推送%rbp 0x0000000100000f21:mov%rsp,%rbp 0x0000000100000f24:mov$0x2,%eax 0x0000000100000f29:mov%edi,-0x4(%rbp) =>0x0000000100000f2c:mov-0x4(%rbp),%edi 0x0000000100000f2f:mov%eax,-0xc(%rbp) 0x0000000100000f32:mov%edi,%eax 0x0000000100000f34:cltd 0x0000000100000f35:mov-0xc(%rbp),%edi 0x0000000100000f38:idiv%edi 0x0000000100000f3a:cmp$0x0,%edx 0x0000000100000f3d:jne 0x100000f4f 0x0000000100000f43:movl$0x1,-0x8(%rbp) 0x0000000100000f4a:jmpq 0x100000f56 0x0000000100000f4f:movl$0x0,-0x8(%rbp) 0x0000000100000f56:mov-0x8(%rbp),%eax 0x0000000100000f59:弹出%rbp 0x0000000100000f5a:retq 汇编程序转储结束。 (gdb)
我发现以下指令序列实现了我的目标

(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.
谢谢奥拉夫

(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>
(gdb)si
0x0000000100000f32 27如果(数量%2==0)
0x0000000100000f2c:8b 7d fc mov-0x4(%rbp),%edi
0x0000000100000f2f:89 45 f4 mov%eax,-0xc(%rbp)
=>0x0000000100000f32:89 f8 mov%edi,%eax
0x0000000100000f34:99 cltd
0x0000000100000f35:8b 7d f4 mov-0xc(%rbp),%edi
0x0000000100000f38:f7 ff idiv%edi
0x0000000100000f3a:83 fa 00 cmp$0x0,%edx
0x0000000100000f3d:0f 85 0c 00 00 jne 0x100000f4f

那么您不了解的文档或内置帮助是什么呢?通过一个简单的在线搜索,你发现了什么?@Olaf我实际上有GNU源代码级调试器手册,我曾经决定如何单步执行等。但是我没有看到关于如何显示下一条指令的任何信息。@Olaf感谢我找到显示反汇编下一行和设置反汇编下一行的动机。我真诚地希望轻微的踢腿并没有太大的伤害:-)否决了你的问题,但我会让你自己回答-这可能对mee也有用。(只是搜索它对我来说从来没有那么重要——我很少在汇编程序级别进行广泛的调试)。另一种获得大致相同结果的方法:
display/4i$pc