% man troff
Чтобы узнать, как ОС Linux ищет man
-страницы, просмотрите справочную информацию о самой команде man
:
% man man
Можно также подготовить документацию в формате GNU-системы Info. Для получения информацию об этой системе выполните команду
% info info
Для многих Linux-лрограмм имеется также документация в формате простого текста и HTML.
Удачного программирования!
Приложение А
Вспомогательные инструменты разработки
Разработка безошибочных и быстрых Linux-программ требует не только понимания операционной системы Linux и ее системных вызовов. В этом приложении будут рассмотрены методики, позволяющие находить ошибки периода выполнения (например, неправильное использование оперативной памяти) и определять, какие компоненты программы требуют наибольших вычислительных ресурсов. Анализ программного кода дает лишь часть этой информации; чтобы получить остальную часть, необходимо запустить программу и воспользоваться описанными ниже инструментами.
А.1. Статический анализ программы
Некоторые программные ошибки можно выявить, воспользовавшись средствами статического анализа исходных текстов. Если вызвать компилятор gcc
с флагами -Wall
и -pedantic
, он выдаст предупреждения о рискованных и потенциально ошибочных программных конструкциях. Исправив эти конструкции, вы снизите вероятность появления в программе скрытых ошибок, а также упростите компиляцию программы в других вариантах Linux или даже в других операционных системах.
С помощью различных флагов командной строки можно заставить компилятор gcc
выдавать предупреждения о множестве спорных программных конструкций. Большинство проверок включается флагом -Wall
. Например, компилятор будет сообщать о комментарии, начинающемся в другом комментарии, о неправильном типе возвращаемого значении в функции main()
, о функциях, в которых пропущена инструкция return
, и т.д. При наличии флага -pedantic
компилятор будет выдавать предупреждения о несоответствии стандарту ANSI. В частности, будет сообщаться о наличии функции asm()
и других GNU-расширений языка. В документации к компилятору не рекомендуется использовать этот флаг. Мы же советуем избегать большинства GNU-расширений, так как они имеют тенденцию меняться со временем и плохо поддаются оптимизации.
Попробуем скомпилировать программу "Hello, World", представленную в листинге А.1.
Листинг А.1. ( hello.c ) Простейшая программа
main() {
printf("Hello, world.\n");
}
Будучи вызванным без флагов, компилятор не выдаст никаких предупреждений, хотя программа не соответствует стандарту ANSI Если же включить флаги -Wall
и -pedantic
, то обнаружатся три спорные конструкции:
% gcc -Wall -pedantic hello.c
hello.c:2: warning: return type defaults to 'int'
hello.c: In function 'main':
hello.c:3: warning: implicit declaration of function 'printf'
hello.c:4: warning: control reaches end of non-void function
Компилятор сообщает о следующих проблемах:
■ не указан тип возвращаемого значения функции main()
;
■ функция printf()
не объявлена, так как файл не включен в программу;
■ функция main()
, которая неявно возвращает значение типа int
, не содержит инструкцию return
.
Анализ исходных текстов программы не позволяет выявить все возможные ошибки и неэффективные конструкции. В следующем разделе описываются четыре средства поиска ошибок при работе с динамической памятью. В конце приложения будет рассказано о том, как анализировать время работы программы с помощью утилиты-профайлера gprof
.
А.2. Поиск ошибок в динамической памяти
При написании программы зачастую неизвестно, сколько памяти потребуется ей во время выполнения. Например, строка, читаемая из файла, может иметь любую длину. Работа с динамической памятью осуществляется посредством функций malloc()
, free()
и их вариантов. Следует придерживаться таких правил:
■ число запросов на выделение памяти (вызовов функции malloc()
) должно в точности совпадать с чистом запросов на освобождение памяти (вызовов функции free()
);
■ операции чтения и записи динамической памяти должны выполняться в рамках выделенной области, не выходя за ее пределы;
■ к выделенной области нельзя обращаться после того, как она была освобождена.
Выделение и освобождение динамической памяти происходят на этапе выполнения программы, поэтому статический анализ исходных текстов редко позволяет выявить недочеты. Утилиты проверки памяти сначала загружают программу, а затем определяют, нарушаются ли перечисленные выше правила. Выявляются следующие ошибки:
Читать дальше