Показати поточну інструкцію по збірці в GDB


179

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

0x0001433f      990         Foo::bar(p);

Це дає мені адресу поточної інструкції, але я повинен продовжувати посилатися на вихід disassemble, щоб побачити, яку інструкцію я зараз виконую.


Відповіді:


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)

1
@greatwolf, схоже, у вас немає підтримки tui у своєму gdb. Дивіться це запитання для отримання додаткової інформації: stackoverflow.com/q/6706838/72178 .
— ks1322

9
Акуратно! Тепер я можу мати подібне вікно для регістрів? Дійсно можу:layout regs
— Єнс

Дивіться також документи gdb для інших команд 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

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


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

Здається, ця опція не існує в моїй установці. Вилучено?
— фуз

2
@fuz Швидше за все, ваш gdb старий
— tbodt

@fuz присутній принаймні в GDB 8.1 в Ubuntu 18.04.
— Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

дуже корисний навик
— DaSqy Stc

1
показати демонтаж-наступний рядок призначений для тестування, для друку статусу прапора, увімкнення та вимкнення
— Сем

30

Якщо ви хочете, щоб наступні кілька інструкцій відображалися автоматично під час переходу програми, ви можете скористатися командою відображення наступним чином -

display /3i $pc

Наведене вище відображатиме 3 інструкції під час потрапляння точки розриву або під час одноразової дії програми.

Більше деталей у записі в блозі тут .


23

Зсередини gdb натисніть, Ctrl x 2і екран розділиться на 3 частини.

Перша частина покаже вам звичайний код мовою високого рівня.

Другий покаже вам збірку еквівалентною та відповідною instruction Pointer .

Третій представить вам звичайний gdbзапит на введення команд.

Дивіться знімок екрана


Я не міг його запустити Ctrl-X 2, але це виглядає як gdb -tuiрежим, який чудово.
— Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

7
Це також можна отримати з layout splitпідказки gdb.
— chucksmash

22

Інформаційна панель GDB

https://github.com/cyrus-and/gdb-dashboard

Ця конфігурація GDB використовує офіційний API GtB Python, щоб показати нам все, що ми хочемо, коли GDB зупиняється, наприклад, next , як TUI.

Однак я виявив, що ця реалізація є більш надійною та настроюваною альтернативою вбудованому режиму TUI GDB, як пояснено за адресою: gdb split view з кодом

Наприклад, ми можемо налаштувати приладну панель GDB для демонстрації демонтажу, джерела, регістрів та стека за допомогою:

dashboard -layout source assembly registers stack

Ось як це виглядає, якщо натомість увімкнути всі доступні перегляди:

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

Пов’язані запитання:


1
@downvoters: поясніть, будь ласка, щоб я міг вивчити та покращити інформацію. Я вважаю , що це чудова альтернатива для TUI прийнятого в даний час відповідь: stackoverflow.com/a/2015523/895245
— Чіро Сантіллі郝海东冠状病六四事件法轮功
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.