在GDB中显示当前汇编指令

时间:2009-12-14 19:17:23

标签: assembly gdb

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

0x0001433f      990         Foo::bar(p);

这给了我当前指令的地址,但我必须继续回顾disassemble的输出,以便查看我当前正在执行哪条指令。

7 个答案:

答案 0 :(得分:283)

您可以在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)

答案 1 :(得分:131)

你可以做到

display/i $pc

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

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

答案 2 :(得分:41)

命令

x/i $pc

可以设置为使用通常的配置机制一直运行。

答案 3 :(得分:27)

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

display /3i $pc

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

博客条目here上的更多详情。

答案 4 :(得分:19)

在gdb内按Ctrl x 2,屏幕将分为3部分。

第一部分将向您展示高级语言的普通代码。

其次将显示装配等效的instruction Pointer

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

See the screen shot

答案 5 :(得分:1)

GDB仪表板

https://github.com/cyrus-and/gdb-dashboard

此GDB配置使用官方的GDB Python API向我们显示GDB在next之后停止运行时想要的一切,就像TUI一样。

但是我发现该实现是内置GDB TUI模式的更健壮和可配置的替代方法,如gdb split view with code所述,在此不再赘述。

例如,我们可以配置GDB仪表板,以显示反汇编,源代码,寄存器和堆栈:

dashboard -layout source assembly registers stack

如果改为启用所有可用视图,则显示为以下内容:

enter image description here

答案 6 :(得分:0)

有一个简单的解决方案,包括使用422 Unprocessable Entity,它依次向前移动1条asm指令并显示周围的asm代码。