在GDB中显示当前的汇编指令


179

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

0x0001433f      990         Foo::bar(p);

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


Answers:


314

您可以在GDB中切换到程序集布局:

(gdb) layout asm

有关更多信息,请参见此处。当前的汇编指令将显示在汇编器窗口中。

   ┌───────────────────────────────────────────────────────────────────────────┐
   │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
@greatwolf,看来您的gdb中没有tui支持。有关更多信息,请参见此问题:stackoverflow.com/q/6706838/72178
ks1322

9
整齐!现在可以为寄存器设置一个类似的窗口吗?实际上,我可以:layout regs
Jens 2014年

另请参见gdb docs,以获取其他TUI命令,例如tui reg vector显示矢量reg而不是整数reg。(但是,并非总是非常有用,因为它不能让您仅选择.v8_int16或之类的东西,因此显示内容非常混乱。)有关调试asm的快速教程,请参见x86标签wiki
彼得·科德斯

那是关于一个无用的功能和输出。C ++乱码名称太长,我要查看的所有内容均不在右侧屏幕上。这是一个多么愚蠢的决定(默认情况下,不显示ASM si),以及一个无用的功能(不显示必要信息的视口)。拒绝投票这个答案是没有意义的,因为您只是信使...
jww

1
同样,·layout src在调试时可以查看源代码,也值得记住退出此模式的方式CTRL+x+a
Huang

149

你可以做

display/i $pc

并且每当GDB停止时,它将显示下一条指令的反汇编。

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


1
使用si(而不是s)时如何启用此功能?
jww

54

命令

x/i $pc

可以使用常规配置机制将其设置为始终运行。


29
x/ni $pc查看接下来的n条指令,这通常非常有用。
斯蒂芬·佳能

48

设置以下选项:

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

我的安装中似乎不存在此选项。它被删除了吗?
fuz

2
@fuz您的gdb很可能是旧的
tbodt

@fuz至少存在于Ubuntu 18.04的GDB 8.1中。
西罗Santilli郝海东冠状病六四事件法轮功

非常有用的技能
DaSqy Stc,

1
show disassemble-next-line用于测试,以打开或关闭打印标志状态
Sam

30

如果您希望在逐步执行程序时自动显示接下来的几条说明,则可以使用display命令,如下所示:

display /3i $pc

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

此处的博客条目中有更多详细信息。


23

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

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

第二步将向您显示程序集的等效项和对应项instruction Pointer

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

看到屏幕截图


我无法使用来启动它Ctrl-X 2,但是它看起来像gdb -tui模式,这很棒。
西罗桑蒂利郝海东冠状病六四事件法轮功

7
layout split通过gdb提示符也可以达到此目的。
chucksmash '17

22

GDB资讯主页

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

这个GDB配置使用官方的GDB Python API向我们展示了GDB停止运行后我们想要的任何东西,例如nextTUI。

但是,我发现此实现是内置GDB TUI模式的更健壮和可配置的替代方法,如以下所述:gdb split view with code

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

dashboard -layout source assembly registers stack

如果启用所有可用视图,则显示如下:

在此处输入图片说明

相关问题:


1
@downvoters:请解释一下,以便我学习和改进信息。我认为,这是对当前TUI接受的答案一种更好的选择:stackoverflow.com/a/2015523/895245
西罗桑蒂利郝海东冠状病六四事件法轮功
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.