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

Assembly 在GDB中显示当前汇编指令,assembly,gdb,Assembly,Gdb,我正在GDB中进行一些汇编级调试。有没有办法让GDB以显示当前源代码行的方式向我显示当前的汇编指令?每个命令后的默认输出如下所示: 0x0001433f 990 Foo::bar(p); (gdb) stepi 0x000002ce in ResetISR () at startup_gcc.c:245 245 { 0x000002cc <ResetISR+0>: 80 b5 push {r7, lr} => 0x000002ce &

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

0x0001433f      990         Foo::bar(p);
(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
这给了我当前指令的地址,但我必须继续引用反汇编的输出,以查看当前正在执行的指令。

命令

x/i $pc
可以使用常用的配置机制设置为始终运行。

您可以这样做

display/i $pc
每次GDB停止时,它都会显示下一条指令的反汇编


GDB-7.0
还支持
上设置反汇编下一行,这将反汇编整个下一行,并为您提供更多反汇编上下文。

您可以切换到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)
┌───────────────────────────────────────────────────────────────────────────┐
│0x7ffff740d756 mov 0x39670b(%rip),%rax#│
│0x7ffff740d75d mov 0x8(%rsp),%rsi│
│0x7ffff740d762 mov 0x14(%rsp),%edi│
│0x7ffff740d766 mov(%rax),%rdx│
│0x7ffff740d769呼叫Q*0x18(%rsp)│
>│0x7ffff740d76d mov%eax,%edi│
│0x7ffff740d76f呼叫0x7ffff7427970│
│0x7ffff740d774异或%edx,%edx│

│0x7ffff740d776 jmpq 0x7ffff740d6b9如果您希望在单步执行程序时自动显示接下来的几条指令,可以使用如下显示命令-

display/3i$pc

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


更多详细信息请访问博客条目。

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

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

第二步将向您显示程序集等效项和相应的
指令指针

第三个命令将向您显示正常的
gdb
提示以输入命令


设置以下选项:

set  disassemble-next-line on
show disassemble-next-line
将为您提供如下结果:

0x0001433f      990         Foo::bar(p);
(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
(gdb)步骤i
启动时重置ISR()中的0x000002ce\u gcc.c:245
245 {
0x000002C:80 b5推送{r7,lr}
=>0x000002ce:82 b0子sp,#8
0x000002d0:00 af添加r7,sp,#0
(gdb)stepi
0x000002D0245{
0x000002C:80 b5推送{r7,lr}
0x000002ce:82 b0子sp,#8
=>0x000002d0:00自动对焦加上r7,sp,#0

GDB仪表板

这个GDB配置使用官方的GDB Python API,在GDB停止后向我们显示我们想要的任何东西,例如
next
,很像TUI

然而,我发现该实现是内置GDB TUI模式的一个更健壮和可配置的替代方案,如以下所述:

例如,我们可以将GDB Dashboard配置为显示反汇编、源代码、寄存器和堆栈:

dashboard -layout source assembly registers stack
以下是启用所有可用视图时的情况:

相关问题:



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

x/ni$pc
来查看接下来的n条指令,这通常是非常有用的。始终运行命令的配置机制是什么?@greatwolf,看起来像是您您的gdb中不支持tui。有关更多信息,请参见此问题:。整洁!现在我可以为寄存器设置一个类似的窗口吗?事实上,我可以:
layout regs
另请参见,如
tui reg vector
,以显示向量寄存器,而不是整数寄存器。(但并不总是非常有用,因为它不允许您仅选择
.v8_int16
或其他内容,因此显示非常混乱。)请参阅快速教程,调试ASM。这是一个无用的特性和输出。C++的名字太长,我想查看的东西都是屏幕右边的。多么愚蠢的决定(在代码< S> <代码>时,不显示ASM),这是个无用的特性。(不显示必要信息的视口).投票否决这个答案没有意义,因为你只是信使…同样地,
·布局src
在调试时查看源代码,也值得记住通过
CTRL+x+a退出此模式,我无法用
CTRL-x2
启动它,但它看起来像
gdb-tui
模式,这很好。这也是reac可以从gdb提示符中使用
layout split
。相关:此选项在我的安装中似乎不存在。它是否已被删除?@fuz更有可能的是,您的gdb已被删除old@fuz至少在Ubuntu18.04的GDB8.1中出现。非常有用的技巧显示反汇编下一行用于测试,打印标志状态,打开或关闭如何在使用
si
(但不使用
s
)?您也可以在此处使用
display/ni$pc
来显示
n
说明,如@downvorters:请解释,以便我可以学习和改进信息。我相信这是TUI目前接受的答案的一个更好的选择:Santilli这是一个非常有用的工具。但当我使用它时,我只能查看代码r当前代码位置。有时代码执行到第n行,但我想看看其他位置的代码是什么(例如某个函数)?有没有办法使显示的代码位置滑动(如果汇编代码可以滑动,那就更好)?@cyj