我正在GDB中进行一些汇编级调试.有没有办法让GDB以与显示当前源代码行相同的方式向我显示当前的汇编指令?每个命令后的默认输出如下所示:
0x0001433f 990 Foo::bar(p);
Run Code Online (Sandbox Code Playgroud)
这给了我当前指令的地址,但是我必须继续参考输出,disassemble
以便查看我当前正在执行哪条指令.
ks1*_*322 297
您可以在GDB中切换到装配布局:
(gdb) layout asm
Run Code Online (Sandbox Code Playgroud)
有关更多信息,请参见此处 当前汇编指令将显示在汇编窗口中.
?????????????????????????????????????????????????????????????????????????????
?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)
Run Code Online (Sandbox Code Playgroud)
Emp*_*ian 136
你可以做
display/i $pc
Run Code Online (Sandbox Code Playgroud)
每次GDB停止时,它都会显示下一条指令的反汇编.
GDB-7.0
还支持set disassemble-next-line on
,它将拆卸整个下一行,并为您提供更多的反汇编语境.
bma*_*ies 45
命令
x/i $pc
Run Code Online (Sandbox Code Playgroud)
可以设置为使用通常的配置机制一直运行.
小智 41
设置以下选项:
set disassemble-next-line on
show disassemble-next-line
Run Code Online (Sandbox Code Playgroud)
会给你看起来像这样的结果:
(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
Run Code Online (Sandbox Code Playgroud)
abh*_*bhi 20
从gdb内部按下Ctrl
x
2
,屏幕将分为3个部分.
第一部分将向您展示高级语言的常规代码.
第二个将显示装配等效和相应的instruction Pointer
.
第三个将显示gdb
输入命令的正常提示.
Cir*_*四事件 10
GDB资讯主页
https://github.com/cyrus-and/gdb-dashboard
这个GDB配置使用官方的GDB Python API向我们展示了我们在GDB停止运行后想要的任何东西,例如next
TUI。
但是,我发现此实现是内置GDB TUI模式的更健壮和可配置的替代方案,如以下所述:gdb split view with code
例如,我们可以配置GDB仪表板以显示反汇编,源代码,寄存器和堆栈,其中包括:
dashboard -layout source assembly registers stack
Run Code Online (Sandbox Code Playgroud)
如果启用所有可用视图,则显示如下:
相关问题:
归档时间: |
|
查看次数: |
185712 次 |
最近记录: |