我正在GDB中进行一些汇编级调试 . 有没有办法让GDB以与显示当前源代码行相同的方式向我显示当前的汇编指令?每个命令后的默认输出如下所示:
0x0001433f 990 Foo::bar(p);
这给了我当前指令的地址,但我必须继续引用 disassemble 的输出,以便查看我当前正在执行的指令 .
disassemble
你可以做
display/i $pc
每次GDB停止时,它都会显示下一条指令的反汇编 .
GDB-7.0 也支持 set disassemble-next-line on ,它将反汇编整个下一行,并为您提供更多的反汇编上下文 .
GDB-7.0
set disassemble-next-line on
命令
x/i $pc
可以使用通常的配置机制设置为始终运行 .
您可以在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命令,如下所示 -
display /3i $pc
每当遇到断点或单步执行程序时,上面将显示3条指令 .
更多详情请访问博客文章here .
设置以下选项:
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内按 Ctrl x 2 ,屏幕将分为3部分 .
Ctrl
x
2
第一部分将向您展示高级语言的常规代码 .
第二个将显示装配等效和相应的 instruction Pointer .
instruction Pointer
第三个将显示正常 gdb 提示输入命令 .
gdb
6 回答
你可以做
每次GDB停止时,它都会显示下一条指令的反汇编 .
GDB-7.0
也支持set disassemble-next-line on
,它将反汇编整个下一行,并为您提供更多的反汇编上下文 .命令
可以使用通常的配置机制设置为始终运行 .
您可以在GDB中切换到装配布局:
有关更多信息,请参见here . 当前汇编指令将显示在汇编窗口中 .
如果您希望在单步执行程序时自动显示下几条指令,可以使用display命令,如下所示 -
display /3i $pc
每当遇到断点或单步执行程序时,上面将显示3条指令 .
更多详情请访问博客文章here .
设置以下选项:
会给你看起来像这样的结果:
从gdb内按
Ctrl
x
2
,屏幕将分为3部分 .第一部分将向您展示高级语言的常规代码 .
第二个将显示装配等效和相应的
instruction Pointer
.第三个将显示正常
gdb
提示输入命令 .