Показати поточну інструкцію по збірці в 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.