Шрифт:
Интервал:
Закладка:
С помощью gdb вы сможете:
♦ запустить вашу программу с определенными аргументами;
♦ запустить программу в пошаговом режиме;
♦ установить точки останова (breakpoint);
♦ установить условие останова программы;
♦ узнать, что случилось, если программа неожиданно завершилась.
22.2. Отладчик gdb
Формат вызова отладчика gdb следующий:
gdb [-help] [-nx] [-q] [-batch] [-cd=dir] [-f] [-b bps] [-tty=dev] [-s symfile] [-e prog] [-sе prog] [-c core] [-x cmds] [-d dir] [prog|core|procID]]
Ключи отладчика описаны в таблице 22.1.
Ключи командной строки gdb Таблица 22.1
Ключ Назначение -help или -h Вывод краткого описания всех параметров -nx или -n Не обрабатывать команды файла инициализации .gdbinit -q Не выводить приветствие и информацию об авторских правах -batch Командный режим. Отладчик возвращает 0, если были выполнены все команды, указанные в файле, заданном параметром -x (и файле .gdbinit, если его использование разрешено). Если же хотя бы одна из команд не выполнена, возвращается ненулевое значение -cd=каталог Установить рабочий каталог (по умолчанию используется текущий каталог) -f или -fullname Данная опция нужна, если вы планируете использовать интерфейс текстового процессора Emacs для отладки ваших программ с помощью gdb. Для более подробного описаний обратитесь к справочной системе -b bps (bits per second) Установить скорость обмена информацией по последовательному интерфейсу, если вы отлаживаете вашу программу удаленно -tty=терминал Установить терминал в качестве стандартного ввода и вывода для отлаживаемой программы. -s файл или -symbols=файл Читает таблицу символов из указанного файла -write Разрешить запись в исполняемые и core-файлы -e программа Использовать указанную программу в качестве фильтра дампа -se=файл Читать таблицу символов из указанного файла и использовать указанный файл в качестве исполнимого -core=файл или -с файл Указать файл дампа -command=файл или -x файл Выполнить указанные в файле команды (используется в командном режиме) -d каталог Добавить каталог к списку поиска исходных текстов [prog|core|procID] Последний параметр задает объект, который нужно отлаживать. Вы можете задать программу (prog), или дамп-файл (core), который будет создан в случае ошибки программы (Segmentation fault), или же подсоединиться к уже запущенному процессу (procID) -p PID Подключиться к уже запущенному процессу (данная опция стала доступной в версии gdb 5.2)Чтобы использовать gdb для отладки вашей программы, нужно добавить в исполняемый файл отладочную информацию. Для этого откомпилируете вашу программу с опцией -g:
$ gcc -g -o prog prog.c
Данная опция включает отладочную информацию в родном для операционной системы формате, с которым может работать gdb.
Затем нужно вызвать gdb так:
$ gdb prog
Если после запуска вашей программы произошла ошибка и был создан дамп-файл (core), можно передать отладчику и этот файл:
$ gdb prog core
Можно также подключиться к уже запущенному процессу, для этого нужно передать его PID:
$ gdb 1111
Только убедитесь сначала в том, что у вас нет файла 1111, поскольку gdb сначала ищет исполняемый файл, затем core-файл, а уже затем PID.
После запуска отладчика в интерактивном режиме вы можете использовать команды, самые важные из которых перечислены в таблице 22.2. Об остальных можно узнать в справочной системе: man gdb.
Команды gdb Таблица 22.2
Команда Назначение break [файл:]функция Установить точку останова run [аргументы] Запустить программу и передать ей указанные аргументы bt Обратная трассировка: отобразить стек программы print выражение Вывести значение выражении, операндами могут быть переменные, объявленные в вашей программа С Продолжить выполнение программы (после останова) Next Выполнить следующую строку. Это так называемый шаг «над» (step over). Если следующая строка — вызов функции, то мы выполним ее за один шаг — «перешагнем» ее Step Выполнить следующую строку, Это так называемый шаг «в» (step into). Если следующая строка — вызов функции, то мы будем последовательно выполнять все операторы тела функции help [имя] Вывести справку о команде отладчика или вывести общую информацию о нем Quit ВыходВ данной таблице приведены далеко не все команды. Если вас интересует более полная информация, обратитесь к руководству по gdb.
22.3. Пример отладки программы
Давайте напишем программу, которая обнуляет элементы массива a[]. Да, программа ничего полезного не делает, но на ее примере можно продемонстрировать работу с отладчиком gdb.
Вот листинг программы:
Листинг 22.1. Демонстрационная программа, содержащая ошибку
#include <stdio.h>
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:
- Операционная система UNIX - Андрей Робачевский - Программное обеспечение
- Разработка приложений в среде Linux. Второе издание - Майкл Джонсон - Программное обеспечение
- Искусство программирования для Unix - Эрик Реймонд - Программное обеспечение
- Linux - Алексей Стахнов - Программное обеспечение
- Fedora 8 Руководство пользователя - Денис Колисниченко - Программное обеспечение
- Недокументированные и малоизвестные возможности Windows XP - Роман Клименко - Программное обеспечение
- Изучаем Windows Vista. Начали! - Дмитрий Донцов - Программное обеспечение
- Windows Vista - Виталий Леонтьев - Программное обеспечение
- Архитектура операционной системы UNIX - Морис Бах - Программное обеспечение
- Windows Vista. Трюки и эффекты - Юрий Зозуля - Программное обеспечение