Показать текущую инструкцию по сборке в GDB

179

Я делаю некоторую отладку на уровне сборки в GDB. Есть ли способ заставить GDB показывать мне текущую инструкцию по сборке так же, как она показывает текущую исходную строку? Вывод по умолчанию после каждой команды выглядит следующим образом:

0x0001433f      990         Foo::bar(p);

Это дает мне адрес текущей инструкции, но я должен постоянно возвращаться к выводу команды disassemble, чтобы увидеть, какую инструкцию я сейчас выполняю.

JSB ձոգչ
источник
1
Связанный: stackoverflow.com/questions/589653/switching-to-assembly-in-gdb
Скотт С. Уилсон,

Ответы:

314

Вы можете переключиться на компоновку в 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)
ks1322
источник
1
@greatwolf, похоже, у тебя нет поддержки tui в твоей GDB. См. Этот вопрос для получения дополнительной информации: stackoverflow.com/q/6706838/72178 .
ks1322
9
Ухоженная! Теперь я могу иметь подобное окно для регистров? На самом деле я могу:layout regs
Jens
Смотрите также gdb docs для других команд TUI , например, tui reg vectorчтобы показать векторные регистры вместо целочисленных. (Тем не менее, это не всегда удобно, потому что он не позволяет вам выбрать только что- .v8_int16то или что-то, поэтому на экране большой беспорядок.) См. Вики-тег x86 для быстрого обучения отладке asm
Питер Кордес
Это о бесполезной функции и выходе. Искаженные имена в C ++ слишком длинные, и все, что я пытаюсь просмотреть, находится за пределами экрана справа. Какое глупое решение (не отображать ASM по умолчанию, когда si) и какая бесполезная функция (область просмотра, которая не отображает необходимую информацию). Там нет никакого смысла вниз голосования этого ответа , так как вы только посланник ...
jww
1
Точно так же, ·layout srcчтобы увидеть исходный код при отладке, а также стоит помнить о выходе из этого режима,CTRL+x+a
Baiyan Huang
149

Ты можешь сделать

display/i $pc

и каждый раз, когда GDB останавливается, он будет отображать разборку следующей инструкции.

GDB-7.0также поддерживает set disassemble-next-line on, что будет разбирать всю следующую строку, и даст вам больше контекста разборки.

Занятый русский
источник
1
Как мы включаем эту функцию при использовании si(но не s)?
jww
54

Команда

x/i $pc

можно настроить на постоянную работу с использованием обычного механизма настройки.

bmargulies
источник
29
И x/ni $pcдля просмотра следующих n инструкций, что часто бывает весьма полезно.
Стивен Кэнон
48

Установка следующей опции:

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
Боб Энсинк
источник
Эта опция, кажется, не существует в моей установке. Это было удалено?
fuz
2
@fuz Скорее всего, ваш GDB старый
tbodt
@fuz присутствует как минимум в GDB 8.1 в Ubuntu 18.04.
Сиро Сантилли 郝海东 冠状 病 六四 事件 法轮功
очень полезный навык
DaSqy Stc
1
show disassemble-next-line для теста, для печати статуса флага,
Сэм
30

Если вы хотите, чтобы следующие несколько инструкций отображались автоматически при пошаговом выполнении программы, вы можете использовать команду display следующим образом:

display /3i $pc

Приведенное выше будет отображать 3 инструкции при каждом достижении точки останова или при выполнении одного шага программы.

Более подробная информация в блоге здесь .

Мохит
источник
23

Изнутри GDB нажмите Ctrl x 2и экран разделится на 3 части.

Первая часть покажет вам нормальный код на языке высокого уровня.

Второй покажет вам сборку, эквивалентную и соответствующую instruction Pointer.

Третий представит вам обычную gdbподсказку для ввода команд.

Смотрите скриншот

абхи
источник
Я не мог запустить его Ctrl-X 2, но он выглядит как gdb -tuiрежим, и это здорово.
Сиро Сантилли 郝海东 冠状 病 六四 事件 法轮功
7
Это также доступно layout splitиз командной строки gdb.
chucksmash
22

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

Вот как это выглядит, если вместо этого вы активируете все доступные виды:

введите описание изображения здесь

Смежные вопросы:

Сиро Сантилли 郝海东 冠状 病 六四 事件 法轮功
источник
1
@ downvoters: пожалуйста, объясните, чтобы я мог учиться и улучшать информацию. Я считаю, что это превосходная альтернатива для принятого в настоящее время ответа на TUI: stackoverflow.com/a/2015523/895245
Сиро Сантилли 郝海东 冠状 病 六四 事件 法轮功