list
command выводит набор строк, но мне нужна одна строка, где я нахожусь и где, вероятно, произошла ошибка.
bt
или backtrace
или where
напечатать стек вызовов функций, f
или frame
напечатать следующую строку для выполнения.
list
command выводит набор строк, но мне нужна одна строка, где я нахожусь и где, вероятно, произошла ошибка.
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 - это мощная команда, способная выполнять инструкции низкого уровня, поэтому она привязана к концепциям сборки.
То, что вы ищете, называется указателем инструкции, то есть:
Регистр указателя команд указывает на адрес памяти, который процессор попытается выполнить в следующий раз. Указатель инструкции называется ip в 16-битном режиме, eip в 32-битном режиме и rip в 64-битном режиме.
подробнее здесь
все регистры, доступные при выполнении GDB, могут быть показаны с помощью:
(gdb) info registers
с его помощью вы можете узнать, в каком режиме работает ваша программа (глядя, какие из этих регистров существуют)
затем (здесь используется наиболее распространенное в настоящее время копирование регистров , при необходимости замените на eip или очень редко на ip ):
(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