Команда | Назначение |
---|---|
break [файл:]функция | Установить точку останова |
run [аргументы] | Запустить программу и передать ей указанные аргументы |
bt | Обратная трассировка: отобразить стек программы |
print выражение | Вывести значение выражении, операндами могут быть переменные, объявленные в вашей программа |
С | Продолжить выполнение программы (после останова) |
Next | Выполнить следующую строку. Это так называемый шаг «над» (step over). Если следующая строка — вызов функции, то мы выполним ее за один шаг — «перешагнем» ее |
Step | Выполнить следующую строку, Это так называемый шаг «в» (step into). Если следующая строка — вызов функции, то мы будем последовательно выполнять все операторы тела функции |
help [имя] | Вывести справку о команде отладчика или вывести общую информацию о нем |
Quit | Выход |
В данной таблице приведены далеко не все команды. Если вас интересует более полная информация, обратитесь к руководству по gdb.
22.3. Пример отладки программы
Давайте напишем программу, которая обнуляет элементы массива a[]
. Да, программа ничего полезного не делает, но на ее примере можно продемонстрировать работу с отладчиком gdb.
Вот листинг программы:
Листинг 22.1. Демонстрационная программа, содержащая ошибку
#include
int main() {
char developer[]="Denis";
int a[10];
int i;
do {
a[i]=0;
i++;
} while (i<10);
return 0;
}
Назовем нашу программу test.c и откомпилируем ее:
$ gcc -g -o test test.с
Опция -g добавляет отладочную информацию для отладчика gdb, а опция -o указывает имя результирующего файла.
Просмотрите листинг программы. Программа не делает ничего подозрительного — она всего лишь в цикле do обнуляет все элементы массива — сначала нулевой элемент a[0] становится нулем, потом первый, второй и так далее.
Попробуйте запустить программу, и вы увидите сообщение: Segmentation fault. В чем же причина? Попробуем выяснить ее с помощью отладчика gdb. Запустите отладчик с параметром test (это имя нашего исполняемого файла):
$ gdb test
В отладчике gdb введем команду run для запуска программы. И что мы видим? Что программа получила сигнал SIGSEGV, то есть имеет место ошибка Segmentation fault. Эта ошибка произошла в строке 12: a[i]=0. Но что может быть опасного в этом операторе? Ошибка Segmentation fault может произойти по нескольким причинам, одной из которых является выход за пределы массива. Проверим это: введите команду print i.
Команда print выводит значение указанной переменной (или выражения). Ого! Оказывается, мы пытаемся обнулить не нулевой элемент массива, а 715910728-ой! Почему же так произошло? Может быть, это gdb нагло врет и вместо значения переменной i выводит непонятно что? Для проверки на лживость введите команду print developer, которая выведет на экран значение переменной developer. С переменной developer все нормально — ее значение «Denis» (рис. 22.1).
Рис. 22.1. Сессия gdb
Так что же произошло? Так как переменная i не является глобальной, ее значение не обнуляется при запуске программы. Чтобы избежать подобной ошибки, нужно инициализировать переменную при объявлении:
int i = 0;
Вот мы и нашли ошибку!
Что же еще можно сделать с помощью gdb? Можно установить breakpoint, то есть точку останова, прерывающую выполнение программы в указанном месте. Это нужно для того, чтобы проследить состояние некоторых переменных и/или стека программы перед запуском какой-нибудь функции или же для пошаговой трассировки программы. Для пошаговой трассировки программы установите точку останова для функции main:
break main
Для установки точки останова на другую функцию введите команду break и в качестве аргумента укажите имя функции. Теперь запустите программу на выполнение (команда run). Команде run можно передать также аргументы, с которыми должна запускаться программа, например, run /home/denis/report.txt.
Вильям Л Саймон , Вильям Саймон , Наталья Владимировна Макеева , Нора Робертс , Юрий Викторович Щербатых
Зарубежная компьютерная, околокомпьютерная литература / ОС и Сети, интернет / Короткие любовные романы / Психология / Прочая справочная литература / Образование и наука / Книги по IT / Словари и Энциклопедии