1) Неправильное использование операторов * и &. Это самая распространенная группа ошибок начинающих программистов. Вот характерный пример такой ошибки:
/* неправильно */
char *s;
*s = (char *s)malloc(25);
/* правильно */
char *s;
s = (char *s)malloc(25);
2) Выделение недостаточного для адресации объекта объема памяти. Например, мы получим такую ошибку, если попытаемся скопировать в строку s (вышеприведенный фрагмент кода) строку, состоящую из 30 символов,
3) Использование неинициализированных указателей. Такие ошибки часто встречаются при работе с динамическими структурами. Например, с линейными списками: вы забыли инициализировать главный элемент (head = NULL) и пытаетесь добавить в список новый элемент.
Использование рекурсивных вызовов может повлечь за собой ошибку переполнения стека, если вы неправильно зададите условие завершения рекурсии. Как правило, рекурсивная функция вызывает саму себя с несколько измененными параметрами. Рано или поздно такая функция должна, в зависимости от переданных параметров, возвратить какое-нибудь значение, а не опять вызвать саму себя.
Для облегчения поиска ошибок были созданы специальные программы — отладчики. Одним из самых удачных отладчиков для Linux является gdb (The GNU Debugger). Этот отладчик входит в состав всех распространенных дистрибутивов (за исключением их «урезанных» версий — для рабочих станций), и для его установки достаточно установить пакет gdb.
С помощью 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=файл | Читать таблицу символов из указанного файла и использовать указанный |