admin / 24.12.2017
Содержание
Вы можете сокращать команды GDB по нескольким первым символам имени команды, если это сокращение однозначно; и вы можете повторять определенные команды GDB простым нажатием . Вы также можете использовать клавишу для того, чтобы GDB сам дополнил остаток слова в команде (или показал вам возможные альтернативы, если существует несколько вариантов).
Команда GDB представляет собой одну строку ввода. Никаких ограничений на ее длину нет. Она начинается именем команды, за которым следуют параметры, значение которых определяется ее названием. Например, команда допускает в качестве параметра число шагов, как в . Вы также можете использовать команду и без параметров. Некоторые команды не допускают никаких параметров.
Названия команд GDB всегда могут быть сокращены, если это сокращение однозначно. Другие возможные сокращения команд перечислены в документации по отдельным командам. В некоторых случаях, допускаются даже неоднозначные сокращения; напрмер, специально определено как эквивалент , даже если существуют другие команды, чьи названия начинаются на . Вы можете проверить сокращения, задавая их как параметр для команды .
Введенная пустая строка (просто нажатие ), означает повтор предыдущей команды. Определенные команды (например, ) не повторяются таким способом; это те команды, непреднамеренное повторение которых может вызвать проблемы и которые вы вряд ли захотите повторять.
Команды и , при их повторе нажатием , вместо точного повтора создают новые параметры. Это позволяет легко просматривать исходный текст или память.
GDB может также использовать по-другому: для разделения длинного вывода, аналогично обычной утилите (see section Размер экрана). Так как в такой ситуации легко нажать слишком много раз, GDB блокирует повтор после любой команды, генерирующей такой тип вывода.
Любой текст, расположенный от до конца строки является комментарием; он ничего не делает. В основном, это полезно в командных файлах (see section Командные файлы).
GDB может дополнить за вас окончание слова в команде, если существует только один вариант; он также может в любой момент показать, какие завершения возможны для следующего слова в команде. Это работает для команд и подкоманд GDB, а также для имен символов в вашей программе.
Нажмите в любой момент, когда захотите, чтобы GDB дополнил оставшуюся часть слова. Если существует только одна возможность, GDB дополняет слово и ждет, пока вы закончите команду (или нажмете , чтобы ввести ее). Например, если вы введете
(gdb) info bre
GDB дополнит остаток слова , так как у команды есть единственная подкоманда, начинающаяся с :
(gdb) info breakpoints
Теперь вы можете нажать либо , чтобы выполнить команду , либо удалить часть символов и ввести что-то другое, если не является той командой, которую вы ожидали. (Если вы с самого начала были уверены, что хотите , вы также могли просто нажать , сразу после , использовав сокращение команды вместо завершения).
Если при нажатии существует несколько вариантов для следующего слова, GDB издает звук. Вы можете либо ввести больше символов и попробовать снова, либо нажать второй раз; GDB выведет все возможные завершения для этого слова. Например, вы можете захотеть установить точку останова на подпрограмме, чье имя начинается с , но когда вы вводите , GDB лишь издает звук. Повторное нажатие отображает все имена функций в вашей программе, начинающиеся с этих символов. Например:
(gdb) b make_ GDB издает звук; нажав еще раз, видим: make_a_section_from_file make_environ make_abs_section make_function_type make_blockvector make_pointer_type make_cleanup make_reference_type make_command make_symbol_completion_list (gdb) b make_
После отображения возможных вариантов, GDB копирует ваш частичный ввод ( в этом примере), так что вы можете закончить команду.
Если вы сначала хотите только увидеть список альтернатив, вы можете нажать , а не нажимать дважды. означает . Вы можете ввести это либо удерживая клавишу, обозначенную на вашей клавиатуре как (если такая есть), и нажать , или как , за которой следует .
Иногда нужная вам строка, являясь логически «словом», может содержать скобки или другие символы, которые GDB обычно исключает из своего понятия о слове. Чтобы позволить завершению слов работать в такой ситуации, вы можете заключить слова в командах GDB в (знаки одинарных кавычек).
Наиболее вероятная ситуация, где вам это может потребоваться, это при вводе имени функции в Си++. Это происходит потому, что Си++ допускает перегрузку функций (множественные определения одной и той же функции, различающиеся типом параметров). Например, когда вы хотите установить точку останова, вам может потребоваться различать, имеете вы в виду версию с параметром целого типа, , или же версию с параметром вещественного типа, . Для использования возможностей завершения слов в такой ситуации, введите одинарную кавычку в начале имени функции. Это предупреждает GDB, что ему может потребоваться принять во внимание больше информации, чем обычно, когда вы нажимаете или для запроса завершения слова:
(gdb) b ‘bubble( bubble(double,double) bubble(int,int) (gdb) b ‘bubble(
В некоторых случаях, GDB может сам определить, что завершение имени требует использования кавычек. Когда это происходит, GDB вставляет кавычку за вас (выполняя завершение на столько, на сколько это возможно), если вы не ввели ее в первой позиции:
(gdb) b bub GDB изменяет вашу строку ввода на следующую, и издает звук: (gdb) b ‘bubble(
Вообще, GDB может определить, что кавычка нужна (и вставляет ее), если вы запрашиваете завершение перегруженного символа до того, как начали вводить список параметров.
Для большей информации о перегруженных функциях, смотрите section Выражения Си++. Вы можете использовать команду для отключения распознавания перегруженных символов; смотрите section Возможности GDB для Си++.
Используя команду , вы всегда можете запросить информацию о командах у самого GDB.
В дополнение к , вы можете использовать команды GDB и для получения информации о состоянии вашей программы, или о состоянии самого GDB. Каждая команда поддерживает много тем запросов; это руководство описывает каждую тему в соответствующем месте. Списки в разделах и в Алфавитном указателе указывают на все подкоманды. See section Алфавитный указатель.
Вот три разнообразные подкоманды , которые не имеют соответствующих -команд:
Go to the first, previous, next, last section, table of contents.
() Отобразить значение выражения . Допускается использование практически любого выражения языка C/C++, в том числе и вызовы функций. Например: , , .
Если имеется динамический массив (например, ), то при выводе его на экран () будет напечатано значение указателя, то есть адрес в памяти компьютера. Если хочется вывести весь массив (или его часть), то необходимо воспользоваться оператором создания виртуального массива , левый операнд которого — первый элемент запрашиваемого массива, а правый — длина желаемого массива. Например, или .
Если необходимо отслеживать значение какого-либо выражения, то его можно добавить в список автоматического отображения, и тогда оно будет выводиться каждый раз при остановке программы.
Добавить выражение к списку автоматического отображения. Каждое такое выражение получает свой номер.
Удалить выражение с номером из списка автоматического отображения.
Отключить отбражение элемента с номером из списка, не удаляя его.
Включить отображение элемента из списка, отключенного ранее.
Напечатать значения всех автоматически отображаемых выражений, как это происходит при остановке программы.
Вывести список автоматически отображаемых выражений.
Если в выражениях используются локальные переменные, то эти выражения не определены вне того лексического контекста, в котором они устанавливались. В этом случае соответствующие отображения будут отключены.
В произвольном месте программы можно поставить точку останова, при достижении которой команда остановится. При этом можно исследовать значения переменных, продолжить выполнение программы при помощи команд , , или выполнить другие команды GDB.
() Установить точку останова на строке исходного кода с номером . Все точки останова имеют свои номера, определяемые при их установке.
Установить точку останова на функции . Исполнение программы остановится при вызове этой функции. Распространенный пример: для того, чтобы можно было пошагово исполнять программу с самого начала.
Установка разовой точки останова. Работает аналогично , но точка останова автоматически удаляется при достижении ее.
Установка условной точки останова. Выполнение останавливается на данной строке или функции, если выполнено условие . Пример: .
или Удалить точку останова на функции или в строке с номером .
() Удалить точки останова с номерами из указанного диапазона. Например, или . Если диапазон не задан, удаляются все точки останова.
Отключить точки из заданного диапазона.
Включить точки из заданного диапазона.
Точки из заданного диапазона включаются до первого срабатывания, после чего отключаются.
Точки из заданного диапазона включаются до первого срабатывания, после чего удаляются.
Превращение точки останова с номером в условную с условием .
Превращение точки останова с номером в безусловную.
Вывести информацию обо всех имеющихся точках останова.
Кроме того, можно устанавливать набор команд, которые будут выполнены при достижении точки останова, например, можно просмотреть или изменить значения переменных. Об этом рассказывается на странице 41 русской документации по GDB.
Если непонятно, в каком месте программы находится ошибка, то возможно в отладке помогут точки наблюдения. Точка наблюдения позволяет остановить программу в любом месте, когда изменяется заданное значение.
Установить точку наблюдения на выражении . Исполнение программы останавливается, когда значение сохраняется программой и его величина изменяется. Пример: .
Установить точку наблюдения, которая остановит програму, когда выражение считывается программой.
Установить точку наблюдения, которая остановит программу, если выражение считывается или сохраняется.
Вывести информацию о всех точках наблюдения.
Для вывода исходного текста программы используется команда () в различных вариантах:
Вывести строки исходного кода, вокруг строки с номером .
Вывести начало кода функции .
Вывести строки с номерами от до .
Вывесть строки, начиная с .
Вывести строки до номера .
Вывести еще немного строк. По умолчанию выводится 10 следующих строк, после ранее выведенных. Это значение можно изменить командой .
Когда программа остановила свою работу, прежде всего необходимо узнать, где это произошло и как она туда попала. Особенно это полезно при отладке ошибок.
Всякий раз, когда вызывается функция, информация о вызове сохраняется в стеке. Информация сохраняется в блоке данных, называемом кадром стека.
Вывести содержимое стека.
Переключиться в кадр с номером . При этом можно просматривать значения локальных переменных в контексте этого кадра.
Переместиться по стеку вверх на кадров. По умолчанию равно 1.
Переместиться по стеку вниз на кадров.
Вывести информацию о текущем кадре.
Вывести информацию об аргументах текущего кадра.
Вывести информацию о всех локальных переменных текущего кадра.
.
gdb — наиболее популярный отладчик в системе linux.
Его используют как непосредственно из командной строки, так и из специальных графических оболочек (frontends)
GDB позволяет:
Перед отладкой необходимо скомпилировать программу с ключом -g или -gdb:
Есть также возможность использовать несколько уровней полноты отладочной информации (от 0 до 3):
Для запуска программы под отладчиком используют следующие команды:
в этом случае после старта GDB мы увидим служебную информацию и результат чтения символьной таблицы из программы, например:
Команда
позволяет запустить программу в отладчике без лишней информации
Команда
предназначена для передачи исследуемой программе параметров командной строки
Выход из отладчика осуществляется командами q или quit
Находяcь внутри отладчика можно запустить команду shell:
После загрузки программы мы можем запустить её с помощью run и выполнить всю, а также с помощью start и выполнить её по шагам.
Пример выполнения программы:
Это другой пример выполнения программы (используется start и n (next) для пошагового выполнения:
Команда
устанавливает точку останова на строке с номером N.
Если запустить программу с помощью run, то выполнение остановится на N-ой строке.
Команда
в любой момент выводит на экран список точек останова
Точки останова могут содержать условные выражения
break … if cond
Следующая команда заставит остановиться на 25 строке, если значение переменной age больше 15:
Помимо точек останова breakpoints в GDB есть »точки просмотра» watchpoints. Их назначение — останавливать выполнение программы, если заданная переменная изменяется.
Примечание
Точки просмотра нужно задавать, находясь в области видимости исследуемых переменных. То есть для локальных переменных необходимо сначала войти в блок, где переменная объявлена
Продолжить выполнение программы можно командой c (continue)
Кроме команды watch есть аналогичная rwatch, позволяющая задать точку просмотра для переменной, из которой читаются данные.
Точки останова и просмотра можно сделать неактивными с помощью команды disable
Команда list позволяет просмотреть исходный код программы вместе с номерами строк, не покидая отладчик
Команды print и set используются для просмотра и изменения значений переменных
Пример с set
Можно просмотреть содержимое локальных переменных с помощью
Просмотр стека вызовов функций:
FILED UNDER : IT