Программирование для Linux. Профессиональный подход | страница 12



. Чтобы получить о ней более подробную информацию, обратитесь к интерактивной документации, введя такую команду:

>% info make

В документации можно найти полезные сведения о том, как упростить управление файлом >Makefile, уменьшить число необходимых правил и автоматически вычислять зависимости.

1.4. GNU-отладчик gdb

Отладчик — это программа, с помощью которой можно узнать, почему написанная вами программа ведет себя не так, как было задумано. Работать с отладчиком приходится очень часто. Большинство Linux-программистов имеет дело с GNU-отладчиком (GNU Debugger, GDB), который позволяет пошагово выполнять программу, создавать точки останова и проверять значения локальных переменных.

1.4.1. Компиляция с включением отладочной информации

Чтобы можно было воспользоваться GNU-отладчиком, необходимо скомпилировать программу с включением в нее отладочной информации. Этой цели служит опция >-g компилятора. Если имеется описанный выше файл Makefile, достаточно задать переменную >CFLAGS равной >-g при запуске утилиты >make:

>% make CFLAGS=-g

>gcc -g -с main.c

>g++ -g -c reciprocal.cpp

>g++ -g -о reciprocal main.o reciprocal.o

Встречая в командной строке флаг >-g, компилятор включает дополнительную информацию в объектные и исполняемые файлы. Благодаря этой информации отладчик узнает, какие адреса соответствуют тем или иным строкам в том или ином исходном файле, как отобразить значение локальной переменной, и т.д.

1.4.2. Запуск отладчика

Отладчик >gdb запускается следующим образом:

>% gdb reciprocal

После запуска появится строка приглашения такого вида:

>(gdb)

В первую очередь необходимо запустить программу под отладчиком. Для этого введите команду >run и требуемые аргументы. Попробуем вызвать программу без аргументов:

>(gdb) run

>Starting program: reciprocal


>Program received signal SIGSEGV, Segmentation fault.

>__strtol_internal (nptr=0x0, endptr=0x0, base=10, group=0)

>at strtol.c:287

>287  strtol.c: No such file or directory.

>(gdb)

Проблема заключается в том, что в функции >main() не предусмотрены средства контроля ошибок. Программа ожидает наличия аргумента, а в данном случае его нет. Получение сигнала >SIGSEGV означает крах программы. Отладчик определяет, что причина краха находится в функции >__strtol_internal(). Эта функция является частью стандартной библиотеки, но ее исходный файл отсутствует. Вот почему появляется сообщение "No such file or directory". С помощью команды >where можно просмотреть содержимое стека: