Показать текущую инструкцию по сборке в GDB
Я выполняю отладку на уровне сборки в GDB. Есть ли способ заставить GDB показать мне текущую инструкцию по сборке таким же образом, что и текущая строка источника? Выход по умолчанию после каждой команды выглядит следующим образом:
0x0001433f 990 Foo::bar(p);
Это дает мне адрес текущей инструкции, но я должен продолжать ссылаться на вывод disassemble
, чтобы увидеть, какую команду я выполняю в настоящее время.
Ответы
Ответ 1
Вы можете переключиться на макет сборки в 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)
Ответ 2
Вы можете сделать
display/i $pc
и каждый раз, когда GDB останавливается, он отображает разборку следующей инструкции.
GDB-7.0
также поддерживает set disassemble-next-line on
, который разобьет всю следующую строку и даст вам больше контекста разборки.
Ответ 3
Команда
x/i $pc
можно настроить для запуска все время с использованием обычного механизма настройки.
Ответ 4
Установка следующей опции:
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
Ответ 5
Если вы хотите, чтобы следующие несколько инструкций отображались автоматически при прохождении через программу, вы можете использовать команду отображения следующим образом:
display /3i $pc
Вышеуказанное будет отображать 3 инструкции, когда ударяется точка останова или когда вы выполняете один шаг в программе.
Подробнее о записи в блоге здесь.
Ответ 6
Внутри gdb нажмите Ctrl
x
2
, и экран будет разбит на 3 части.
Первая часть покажет вам нормальный код на языке высокого уровня.
Второй покажет вам эквивалент сборки и соответствующий instruction Pointer
.
Третий представит вам обычное приглашение gdb
для ввода команд.
![See the screen shot]()
Ответ 7
GDB Dashboard
https://github.com/cyrus-and/gdb-dashboard
Эта конфигурация GDB использует официальный API GDB Python, чтобы показать нам все, что мы хотим, когда GDB останавливается после, например, next
, во многом как TUI.
Однако я обнаружил, что эта реализация является более надежной и настраиваемой альтернативой встроенному режиму TUI GDB, как описано в разделе: разделенное представление gdb с кодом
Например, мы можем сконфигурировать GDB Dashboard для отображения разборки, источника, регистров и стека с помощью:
dashboard -layout source assembly registers stack
Вот как это выглядит, если вместо этого вы активируете все доступные виды:
![enter image description here]()