list команди друкує набір рядків, але мені потрібен один рядок, де я перебуваю і де, ймовірно, сталася помилка.
btабо backtraceабо whereнадрукуйте стек викликів функцій, fабо frameнадрукуйте наступний рядок для виконання.
list команди друкує набір рядків, але мені потрібен один рядок, де я перебуваю і де, ймовірно, сталася помилка.
btабо backtraceабо whereнадрукуйте стек викликів функцій, fабо frameнадрукуйте наступний рядок для виконання.
Відповіді:
Я отримую ту ж інформацію під час налагодження. Хоча ні, поки я перевіряю стек. Швидше за все, ви б скористалися прапором оптимізації, я думаю. Перевірте це посилання - щось пов’язане.
Спробуйте скомпілювати з -g3видаленням будь-якого прапора оптимізації. Тоді це може спрацювати. HTH!
-gщоб містити інформацію про налагодження, я зараз перебуваю у фреймі стека, взятому з однієї із спільних бібліотек, яка, мабуть, не була скомпільована для того, щоб містити інформацію про рядки. Дякую, кумаре.
Команда '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 можна знайти тут .
Майте на увазі, що gdb - це потужна команда, здатна до інструкцій низького рівня, тому прив’язана до концепцій збірки.
Те, що ви шукаєте, називається покажчиком інструкцій de, тобто:
Регістр покажчика інструкцій вказує на адресу пам'яті, яку процесор спробує виконати наступним чином. Покажчик інструкцій називається ip у 16-розрядному режимі, eip у 32-розрядному режимі та rip у 64-розрядному режимі.
докладніше тут
всі регістри, доступні при виконанні gdb, можна показати за допомогою:
(gdb) info registers
за допомогою нього ви можете знайти, в якому режимі працює ваша програма (дивлячись, який із цих реєстрів існує)
потім (тут з використанням найбільш поширених регістра рип в даний час, замінити EIP або дуже рідко внутрибрюшинно в разі необхідності):
(gdb)info line *$rip
покаже вам номер рядка та джерело файлу
(gdb) list *$rip
покаже вам цей рядок з кількома до і після
але, мабуть
(gdb) frame
у багатьох випадках має бути достатньо.
ipтут ніколи не використовується. Крім того , замість того , щоб явно правопис імені лічильника програми, ви можете використовувати псевдонім GDB для нього: $pc. Тож x/10i $pcрозберу 10 інструкцій на поточному вказівнику інструкцій незалежно від архітектури - це буде працювати на i386, x86_64, ARM тощо.
backtraceабоwhere, навіть,info lineабо простоbt(для зворотного відстеження). dirac.org/linux/gdb для підручника з gdb