gdb: как распечатать текущую строку или найти текущий номер строки?

95

list command выводит набор строк, но мне нужна одна строка, где я нахожусь и где, вероятно, произошла ошибка.

Борис Бурков
источник
23
backtraceили whereдаже info lineили просто bt(для трассировки). dirac.org/linux/gdb для руководства по gdb
dwalter
btили backtraceили whereнапечатать стек вызовов функций, fили frameнапечатать следующую строку для выполнения.
Эрик Ван

Ответы:

21

Я получаю ту же информацию во время отладки. Хотя не во время проверки трассировки стека. Я думаю, что, скорее всего, вы бы использовали флаг оптимизации. Проверьте эту ссылку - что-то связанное.

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

kumar_m_kiran
источник
1
Ах, поэтому, хотя моя программа была скомпилирована, -gчтобы содержать отладочную информацию, я сейчас нахожусь в кадре стека, взятом из одной из разделяемых библиотек, которая, по-видимому, не была скомпилирована для хранения информации о строке. Спасибо, кумар.
Борис Бурков
105

Команда '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 можно найти здесь .

user3162307
источник
21

Имейте в виду, что gdb - это мощная команда, способная выполнять инструкции низкого уровня, поэтому она привязана к концепциям сборки.

То, что вы ищете, называется указателем инструкции, то есть:

Регистр указателя команд указывает на адрес памяти, который процессор попытается выполнить в следующий раз. Указатель инструкции называется ip в 16-битном режиме, eip в 32-битном режиме и rip в 64-битном режиме.

подробнее здесь

все регистры, доступные при выполнении GDB, могут быть показаны с помощью:

(gdb) info registers

с его помощью вы можете узнать, в каком режиме работает ваша программа (глядя, какие из этих регистров существуют)

затем (здесь используется наиболее распространенное в настоящее время копирование регистров , при необходимости замените на eip или очень редко на ip ):

(gdb)info line *$rip

покажет вам номер строки и источник файла

(gdb) list *$rip

покажет вам эту строку с несколькими до и после

но возможно

(gdb) frame

во многих случаях должно быть достаточно.

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

Команда, где можно использовать или рамку . где команда предоставит дополнительную информацию с именем функции

Pravu pp
источник
2

Все приведенные выше ответы верны. Я предпочитаю использовать режим tui (ctrl + XA), который показывает ваше местоположение и функцию в отдельном окне, что очень полезно для пользователей. Надеюсь, это тоже поможет.

Мажар МИК
источник