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