Я делаю некоторую отладку на уровне ассемблера в GDB. Существует ли способ заставить GDB показывать мне текущую инструкцию по сборке таким же образом, что это показывает текущую исходную строку? Вывод по умолчанию после каждой команды похож на это:
0x0001433f 990 Foo::bar(p);
Это дает мне адрес текущей команды, но я должен удержать на месте обращение к выводу disassemble
для наблюдения, какую инструкцию я в настоящее время выполняю.
]Вы можете переключиться на компоновку сборки в 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)
] Команду
x/i $pc
можно настроить на постоянное выполнение с использованием обычного механизма конфигурации.
Вы можете сделать
display/i $pc
, и каждый раз, когда GDB останавливается, он будет отображать дизассемблирование следующей инструкции.
GDB-7.0
также поддерживает set disassemble-next-line на
, что дизассемблирует всю следующую строку и дает вам больше контекста дизассемблирования.