在GDB中显示当前汇编指令

JSB*_*ոգչ 169 assembly gdb

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

0x0001433f      990         Foo::bar(p);
Run Code Online (Sandbox Code Playgroud)

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

ks1*_*322 297

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

(gdb) layout asm
Run Code Online (Sandbox Code Playgroud)

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

   ?????????????????????????????????????????????????????????????????????????????
   ?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)
Run Code Online (Sandbox Code Playgroud)

  • 整齐!现在,我可以为寄存器设置类似的窗口吗?的确,我可以:`布局regs` (6认同)
  • 同理,```·layout src``` 调试时查看源码,也值得记住通过```CTRL+x+a```退出该模式 (2认同)

Emp*_*ian 136

你可以做

display/i $pc
Run Code Online (Sandbox Code Playgroud)

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

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

  • 我们如何在使用 `si`(而不是 `s`)时启用此功能? (2认同)

bma*_*ies 45

命令

x/i $pc
Run Code Online (Sandbox Code Playgroud)

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

  • 并且``x/ni $ pc`来查看接下来的n条指令,这通常非常有用. (25认同)
  • 始终运行命令的配置机制是什么? (2认同)

小智 41

设置以下选项:

set  disassemble-next-line on
show disassemble-next-line
Run Code Online (Sandbox Code Playgroud)

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

(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
Run Code Online (Sandbox Code Playgroud)

  • @fuz 更有可能的是,您的 gdb 已旧 (2认同)

moh*_*hit 28

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

display /3i $pc

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

更多细节请点击此处的博客文章.


abh*_*bhi 20

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

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

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

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

看屏幕截图

  • 使用gdb提示符中的`layout split`也可以访问它. (7认同)

Cir*_*四事件 10

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
Run Code Online (Sandbox Code Playgroud)

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

在此处输入图片说明

相关问题:

  • @downvoters:请解释一下,以便我可以学习和改进信息。我相信这是 TUI 当前接受的答案的绝佳替代方案:/sf/answers/141086641/ (2认同)