我正在 GDB 中进行一些汇编级调试。有没有办法让 GDB 以与显示当前源代码行相同的方式向我显示当前的汇编指令?每个命令后的默认输出如下所示:
0x0001433f 990 Foo::bar(p);
这给了我当前指令的地址,但我必须继续参考 disassemble
的输出才能查看我当前正在执行的指令。
您可以在 GDB 中切换到程序集布局:
(gdb) layout asm
有关详细信息,请参阅 here。当前的汇编指令将显示在汇编窗口中。
┌───────────────────────────────────────────────────────────────────────────┐
│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/i $pc
并且每次GDB停止时,都会显示下一条指令的反汇编。
GDB-7.0
还支持 set disassemble-next-line on
,它将反汇编整个下一行,并为您提供更多反汇编上下文。
si
(而不是 s
)时,我们如何启用此功能?
命令
x/i $pc
可以使用通常的配置机制设置为一直运行。
x/ni $pc
查看接下来的 n 条指令,这通常非常有用。
设置以下选项:
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
如果您希望在单步执行程序时自动显示接下来的几条指令,您可以使用 display 命令,如下所示 -
display /3i $pc
每当遇到断点或单步执行程序时,上面将显示 3 条指令。
博客条目 here 中的更多详细信息。
GDB 仪表板
https://github.com/cyrus-and/gdb-dashboard
此 GDB 配置使用官方 GDB Python API 向我们展示我们想要的任何内容,只要 GDB 在例如 next
之后停止,就像 TUI。
但是,我发现此实现是内置 GDB TUI 模式的更强大且可配置的替代方案,如下所述:gdb split view with code
例如,我们可以配置 GDB Dashboard 以显示反汇编、源代码、寄存器和堆栈:
dashboard -layout source assembly registers stack
如果您改为启用所有可用视图,则如下所示:
https://i.stack.imgur.com/mHC8f.png
相关问题:
在 gdb 中切换到汇编
edit
命令打开 vim 中的代码: vi.stackexchange.com/questions/2046/… 如果是在另一个文件中,我倾向于只使用 Eclipse 并跳转到附近函数的定义Ctrl + Shift + T :-) 不完美,但足够好。
在 gdb 中按 Ctrl
x
2
,屏幕将分成 3 个部分。
第一部分将向您展示高级语言的普通代码。
第二个将向您显示程序集等效项和相应的 instruction Pointer
。
第三个将向您显示正常的 gdb
提示以输入命令。
https://i.stack.imgur.com/tiVcg.png
Ctrl-X 2
启动它,但它看起来像 gdb -tui
模式,这很棒。
layout split
访问。
有一个简单的解决方案是使用 stepi
,它依次向前移动 1 个 asm 指令并显示周围的 asm 代码。
不定期副业成功案例分享
layout regs
tui reg vector
以显示向量 regs 而不是整数 regs。 (但并不总是非常有用,因为它不允许您只选择.v8_int16
或其他东西,因此显示非常混乱。)请参阅 x86 tag wiki 以获取调试 asm 的快速教程。si
时默认不显示 ASM),多么无用的功能(不显示必要信息的视口)。否决这个答案是没有意义的,因为你只是信使......·layout src
调试时查看源代码,也值得记住通过CTRL+x+a
退出此模式