我正在GDB中进行一些程序集级调试。是否有一种方法可以让GDB以显示当前源行相同的方式向我显示当前的汇编指令?每个命令后的默认输出如下所示:
0x0001433f 990 Foo::bar(p);
这给了我当前指令的地址,但我必须继续引用反汇编的输出,以查看我当前正在执行的指令。
我正在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
其他回答
您可以在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)
如果您希望在逐步执行程序时自动显示接下来的几条指令,可以使用display命令,如下所示-
显示/3i $pc
上面的代码将在遇到断点或单步执行程序时显示3条指令。
更多的细节在这里的博客条目。
你可以这样做
display/i $pc
每次GDB停止时,它都会显示下一条指令的解压缩。
GDB-7.0还支持开启下一行反汇编,它将反汇编整个下一行,并为您提供更多的反汇编上下文。
有一个简单的解决方案,就是使用stepi,它依次向前移动1条asm指令,并显示周围的asm代码。
在gdb中按Ctrl x2,屏幕将分成3部分。
第一部分将向您展示高级语言中的正常代码。
其次将向您展示等效的程序集和相应的指令指针。
第三个将向您显示正常的gdb提示符以输入命令。