Я получаю ту же информацию во время отладки. Хотя не во время проверки трассировки стека. Я думаю, что, скорее всего, вы бы использовали флаг оптимизации. Проверьте эту ссылку - что-то связанное.
Попробуйте скомпилировать с -g3удалением любого флага оптимизации. Тогда это может сработать. HTH!
Ах, поэтому, хотя моя программа была скомпилирована, -gчтобы содержать отладочную информацию, я сейчас нахожусь в кадре стека, взятом из одной из разделяемых библиотек, которая, по-видимому, не была скомпилирована для хранения информации о строке. Спасибо, кумар.
Борис Бурков
105
Команда 'frame' даст вам то, что вы ищете. (Это может быть сокращено просто «f»). Вот пример:
Без аргумента «рамка» просто сообщает вам, где вы находитесь (с аргументом она меняет рамку). Более подробную информацию о команде frame можно найти здесь .
Имейте в виду, что gdb - это мощная команда, способная выполнять инструкции низкого уровня, поэтому она привязана к концепциям сборки.
То, что вы ищете, называется указателем инструкции, то есть:
Регистр указателя команд указывает на адрес памяти, который процессор попытается выполнить в следующий раз. Указатель инструкции называется ip в 16-битном режиме, eip в 32-битном режиме и rip в 64-битном режиме.
все регистры, доступные при выполнении GDB, могут быть показаны с помощью:
(gdb) info registers
с его помощью вы можете узнать, в каком режиме работает ваша программа (глядя, какие из этих регистров существуют)
затем (здесь используется наиболее распространенное в настоящее время копирование регистров , при необходимости замените на eip или очень редко на ip ):
Я считаю, что GDB не поддерживает 16-битный режим, поэтому ipздесь никогда не используется. Кроме того , вместо того , чтобы явно правописание имени счетчика программы, вы можете использовать псевдоним GDB для него: $pc. Таким образом, x/10i $pcбудет дизассемблировать 10 инструкций по текущему указателю инструкций независимо от архитектуры - он будет работать на i386, x86_64, ARM и т. Д.
Руслан
19
Команда, где можно использовать или рамку . где команда предоставит дополнительную информацию с именем функции
Все приведенные выше ответы верны. Я предпочитаю использовать режим tui (ctrl + XA), который показывает ваше местоположение и функцию в отдельном окне, что очень полезно для пользователей. Надеюсь, это тоже поможет.
backtrace
илиwhere
дажеinfo line
или простоbt
(для трассировки). dirac.org/linux/gdb для руководства по gdbbt
илиbacktrace
илиwhere
напечатать стек вызовов функций,f
илиframe
напечатать следующую строку для выполнения.Ответы:
Я получаю ту же информацию во время отладки. Хотя не во время проверки трассировки стека. Я думаю, что, скорее всего, вы бы использовали флаг оптимизации. Проверьте эту ссылку - что-то связанное.
Попробуйте скомпилировать с
-g3
удалением любого флага оптимизации. Тогда это может сработать. HTH!источник
-g
чтобы содержать отладочную информацию, я сейчас нахожусь в кадре стека, взятом из одной из разделяемых библиотек, которая, по-видимому, не была скомпилирована для хранения информации о строке. Спасибо, кумар.Команда 'frame' даст вам то, что вы ищете. (Это может быть сокращено просто «f»). Вот пример:
Без аргумента «рамка» просто сообщает вам, где вы находитесь (с аргументом она меняет рамку). Более подробную информацию о команде frame можно найти здесь .
источник
Имейте в виду, что gdb - это мощная команда, способная выполнять инструкции низкого уровня, поэтому она привязана к концепциям сборки.
То, что вы ищете, называется указателем инструкции, то есть:
подробнее здесь
все регистры, доступные при выполнении GDB, могут быть показаны с помощью:
с его помощью вы можете узнать, в каком режиме работает ваша программа (глядя, какие из этих регистров существуют)
затем (здесь используется наиболее распространенное в настоящее время копирование регистров , при необходимости замените на eip или очень редко на ip ):
покажет вам номер строки и источник файла
покажет вам эту строку с несколькими до и после
но возможно
во многих случаях должно быть достаточно.
источник
ip
здесь никогда не используется. Кроме того , вместо того , чтобы явно правописание имени счетчика программы, вы можете использовать псевдоним GDB для него:$pc
. Таким образом,x/10i $pc
будет дизассемблировать 10 инструкций по текущему указателю инструкций независимо от архитектуры - он будет работать на i386, x86_64, ARM и т. Д.Команда, где можно использовать или рамку . где команда предоставит дополнительную информацию с именем функции
источник
Все приведенные выше ответы верны. Я предпочитаю использовать режим tui (ctrl + XA), который показывает ваше местоположение и функцию в отдельном окне, что очень полезно для пользователей. Надеюсь, это тоже поможет.
источник