Assembly 在GDB中显示当前汇编指令
我正在GDB中进行一些汇编级调试。有没有办法让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 &
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