gdb: як надрукувати поточний рядок або знайти номер поточного рядка?


94

list команди друкує набір рядків, але мені потрібен один рядок, де я перебуваю і де, ймовірно, сталася помилка.


23
backtraceабо where, навіть, info lineабо просто bt(для зворотного відстеження). dirac.org/linux/gdb для підручника з gdb
— dwalter

btабо backtraceабо whereнадрукуйте стек викликів функцій, fабо frameнадрукуйте наступний рядок для виконання.
— Ерік Ван,

Відповіді:


21

Я отримую ту ж інформацію під час налагодження. Хоча ні, поки я перевіряю стек. Швидше за все, ви б скористалися прапором оптимізації, я думаю. Перевірте це посилання - щось пов’язане.

Спробуйте скомпілювати з -g3видаленням будь-якого прапора оптимізації. Тоді це може спрацювати. HTH!


1
А, отже, хоча моя програма була скомпільована для того, -gщоб містити інформацію про налагодження, я зараз перебуваю у фреймі стека, взятому з однієї із спільних бібліотек, яка, мабуть, не була скомпільована для того, щоб містити інформацію про рядки. Дякую, кумаре.
— Борис Бурков

104

Команда 'frame' дасть вам те, що ви шукаєте. (Це можна скоротити просто "f"). Ось приклад:

(gdb) frame
\#0  zmq::xsub_t::xrecv (this=0x617180, msg_=0x7ffff00008e0) at xsub.cpp:139
139         int rc = fq.recv (msg_);
(gdb)

Без аргументу "фрейм" просто повідомляє вам, де ви перебуваєте (з аргументом він змінює фрейм). Більше інформації про команду frame можна знайти тут .


21

Майте на увазі, що gdb - це потужна команда, здатна до інструкцій низького рівня, тому прив’язана до концепцій збірки.

Те, що ви шукаєте, називається покажчиком інструкцій de, тобто:

Регістр покажчика інструкцій вказує на адресу пам'яті, яку процесор спробує виконати наступним чином. Покажчик інструкцій називається ip у 16-розрядному режимі, eip у 32-розрядному режимі та rip у 64-розрядному режимі.

докладніше тут

всі регістри, доступні при виконанні gdb, можна показати за допомогою:

(gdb) info registers

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

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

(gdb)info line *$rip

покаже вам номер рядка та джерело файлу

(gdb) list *$rip

покаже вам цей рядок з кількома до і після

але, мабуть

(gdb) frame

у багатьох випадках має бути достатньо.


2
GDB, на мою думку, не підтримує 16-розрядний режим, тому ipтут ніколи не використовується. Крім того , замість того , щоб явно правопис імені лічильника програми, ви можете використовувати псевдонім GDB для нього: $pc. Тож x/10i $pcрозберу 10 інструкцій на поточному вказівнику інструкцій незалежно від архітектури - це буде працювати на i386, x86_64, ARM тощо.
— Руслан

18

Команда, де або фрейм можна використовувати. де команда дасть більше інформації з назвою функції


2

Усі відповіді вище є правильними. Я віддаю перевагу використанню режиму tui (ctrl + XA), який відображає ваше місцезнаходження та функцію в окремому вікні, що дуже корисно для користувачів. Сподіваюся, це теж допомагає.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.