Рейтинговые книги
Читем онлайн Linux: Полное руководство - Денис Колисниченко

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 121 122 123 124 125 126 127 128 129 ... 158

С помощью 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:

1 ... 121 122 123 124 125 126 127 128 129 ... 158
На этой странице вы можете бесплатно читать книгу Linux: Полное руководство - Денис Колисниченко бесплатно.
Похожие на Linux: Полное руководство - Денис Колисниченко книги

Оставить комментарий