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

0x0001433f      990         Foo::bar(p);

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


当前回答

设置如下选项:

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

其他回答

设置如下选项:

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

GDB仪表板

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

这个GDB配置使用官方的GDB Python API来显示我们想要的任何东西,无论何时GDB停止,例如next,很像TUI。

但是,我发现这种实现比内置的GDB TUI模式更健壮,也更可配置,参见:GDB分屏视图与代码

例如,我们可以配置GDB仪表板来显示拆卸、源、寄存器和堆栈:

dashboard -layout source assembly registers stack

下面是如果你启用所有可用视图的效果:

相关问题:

切换到gdb中的程序集

命令

x/i $pc

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

你可以这样做

display/i $pc

每次GDB停止时,它都会显示下一条指令的解压缩。

GDB-7.0还支持开启下一行反汇编,它将反汇编整个下一行,并为您提供更多的反汇编上下文。

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