首页 文章

在GDB中显示当前汇编指令

提问于
浏览
148

我正在GDB中进行一些汇编级调试 . 有没有办法让GDB以与显示当前源代码行相同的方式向我显示当前的汇编指令?每个命令后的默认输出如下所示:

0x0001433f      990         Foo::bar(p);

这给了我当前指令的地址,但我必须继续引用 disassemble 的输出,以便查看我当前正在执行的指令 .

6 回答

  • 24

    你可以做

    display/i $pc
    

    每次GDB停止时,它都会显示下一条指令的反汇编 .

    GDB-7.0 也支持 set disassemble-next-line on ,它将反汇编整个下一行,并为您提供更多的反汇编上下文 .

  • 28

    命令

    x/i $pc
    

    可以使用通常的配置机制设置为始终运行 .

  • 17

    您可以在GDB中切换到装配布局:

    (gdb) layout asm
    

    有关更多信息,请参见here . 当前汇编指令将显示在汇编窗口中 .

    ┌───────────────────────────────────────────────────────────────────────────┐
       │0x7ffff740d756 <__libc_start_main+214>  mov    0x39670b(%rip),%rax        #│
       │0x7ffff740d75d <__libc_start_main+221>  mov    0x8(%rsp),%rsi              │
       │0x7ffff740d762 <__libc_start_main+226>  mov    0x14(%rsp),%edi             │
       │0x7ffff740d766 <__libc_start_main+230>  mov    (%rax),%rdx                 │
       │0x7ffff740d769 <__libc_start_main+233>  callq  *0x18(%rsp)                 │
      >│0x7ffff740d76d <__libc_start_main+237>  mov    %eax,%edi                   │
       │0x7ffff740d76f <__libc_start_main+239>  callq  0x7ffff7427970 <exit>       │
       │0x7ffff740d774 <__libc_start_main+244>  xor    %edx,%edx                   │
       │0x7ffff740d776 <__libc_start_main+246>  jmpq   0x7ffff740d6b9 <__libc_start│
       │0x7ffff740d77b <__libc_start_main+251>  mov    0x39ca2e(%rip),%rax        #│
       │0x7ffff740d782 <__libc_start_main+258>  ror    $0x11,%rax                  │
       │0x7ffff740d786 <__libc_start_main+262>  xor    %fs:0x30,%rax               │
       │0x7ffff740d78f <__libc_start_main+271>  callq  *%rax                       │
       └───────────────────────────────────────────────────────────────────────────┘
    multi-thre process 3718 In: __libc_start_main     Line: ??   PC: 0x7ffff740d76d
    #3  0x00007ffff7466eb5 in _IO_do_write () from /lib/x86_64-linux-gnu/libc.so.6
    #4  0x00007ffff74671ff in _IO_file_overflow ()
       from /lib/x86_64-linux-gnu/libc.so.6
    #5  0x0000000000408756 in ?? ()
    #6  0x0000000000403980 in ?? ()
    #7  0x00007ffff740d76d in __libc_start_main ()
       from /lib/x86_64-linux-gnu/libc.so.6
    (gdb)
    
  • 39

    如果您希望在单步执行程序时自动显示下几条指令,可以使用display命令,如下所示 -

    display /3i $pc

    每当遇到断点或单步执行程序时,上面将显示3条指令 .

    更多详情请访问博客文章here .

  • 124

    设置以下选项:

    set  disassemble-next-line on
    show disassemble-next-line
    

    会给你看起来像这样的结果:

    (gdb) stepi
    0x000002ce in ResetISR () at startup_gcc.c:245
    245 {
       0x000002cc <ResetISR+0>: 80 b5   push    {r7, lr}
    => 0x000002ce <ResetISR+2>: 82 b0   sub sp, #8
       0x000002d0 <ResetISR+4>: 00 af   add r7, sp, #0
    (gdb) stepi
    0x000002d0  245 {
       0x000002cc <ResetISR+0>: 80 b5   push    {r7, lr}
       0x000002ce <ResetISR+2>: 82 b0   sub sp, #8
    => 0x000002d0 <ResetISR+4>: 00 af   add r7, sp, #0
    
  • 263

    从gdb内按 Ctrl x 2 ,屏幕将分为3部分 .

    第一部分将向您展示高级语言的常规代码 .

    第二个将显示装配等效和相应的 instruction Pointer .

    第三个将显示正常 gdb 提示输入命令 .

    See the screen shot

相关问题