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.