Чтение онлайн

ЖАНРЫ

Разработка приложений в среде Linux. Второе издание

Троан Эрик В.

Шрифт:

Команда

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

step
,
s

Выполняет инструкции программы до достижения новой строки исходного кода. См.

next
.

stepi

Выполняет в точности одну инструкцию машинного языка; с заходом внутрь функций. См.

nexti
.

undisplay

Если выдана без аргумента, отменяет все отображения. В противном случае отменяет отображения указанные номерами. См.

display
.

whatis

Выводит тип данных выражения, переданного в качестве аргумента команды.

where
,
w

См.

backtrace
.

x

Команда

x
подобна
print
с тем исключением, что она явно ограничивается выводом содержимого по указанному адресу в произвольном формате. Если идентификатор формата не используется,
gdb
будет
применять самый последний идентификатор из указанных.

4.4. Действия при трассировке программы

Существуют две программы, помогающие трассировать исполняемые файлы. Ни одной из этих программ исходный код не нужен; фактически, они не могут использовать исходные коды. Обе программы выводят в символьной текстовой форме журнал действий, выполняемых приложением.

Первая,

strace
, выводит запись о каждом системном вызове программы. Вторая,
ltrace
, выводит запись о каждой функции библиотеки, которую вызывает программа (и по выбору может также трассировать системные вызовы). Эти инструменты могут оказаться полезными при определении неполадок в случаях явного сбоя.

Например, предположим, что имеется системный демон, функционирующий уже некоторое время, который начал выдавать ошибки сегментации. Скорее всего, это вызвано изменением в некоторых файлах данных, но неизвестно каких именно. Первым шагом должен быть запуск системного демона под управлением

strace
. Нужно просмотреть несколько последних файлов, которые демон открывал перед тем, как произошла ошибка сегментации, и найти в этих файлах возможные причины. Либо предположим, что другой демон внезапно начал занимать много процессорного времени; в этом случае можно запустить его сначала под
strace
, а затем и под
ltrace
, если
strace
четко не покажет, что конкретно делал демон. В результате можно определить входные параметры или условия, которые привели к потреблению такого количества процессорного времени.

Подобно

gdb
,
strace
и
ltrace
можно использовать для выполнения программы от начала до конца или подключаться к уже запущенным программам. По умолчанию
strace
и
ltrace
производят вывод на стандартное устройство вывода. Обе программы требуют указания сначала собственных опций, за которыми должен следовать исполняемый файл для запуска, и, если исполняемый файл указан, то все опции, которые передаются ему, должны записываться следом.

Обе утилиты поддерживают похожий набор опций.

– С
или
– -demangle
Только для
ltrace
. Декодирует (или расшифровывает) имена библиотечных символов в читабельные имена. В результате убираются начальные символы подчеркивания (многие функции
glibc
имеют внутренние имена с начальными символами подчеркивания) и функции библиотеки С++ становятся более читабельными (С++ шифрует информацию о типе в символьные имена).
– е
Только для
strace
. Указывает подмножество вызовов, которые нужно вывести. Существует множество возможных спецификаций, описанных на man-странице
strace
; самой распространенной спецификацией является
– е trace=file
, которая трассирует только системные вызовы, связанные с файловым вводом-выводом и обработкой файлов.
– f
Пытается «следовать вызову
fork
», по возможности трассируя дочерние процессы. Обратите внимание, что дочерний процесс может некоторое время работать без трассировки до тех пор, пока
strace
или
ltrace
сможет подключиться к нему и трассировать его действия.
– о имя_файла
Вместо вывода на стандартное устройство вывода выводит в файл имя файла.
– р pid
Вместо запуска нового экземпляра программы подключается к процессу с идентификатором
pid
.
– S
Только для
ltrace
. Отслеживает системные и библиотечные вызовы.
– v
Только для
strace
. Не сокращает большие структуры в системных вызовах вроде семейства вызовов
stat
,
termios
и так далее.

На man-страницах утилит можно найти описание этих и других опций, здесь не упомянутых.

Глава 5

Опции и расширения

gcc

Для правильного использования

gcc
, стандартного компилятора С для Linux, необходимо изучить опции командной строки. Кроме того,
gcc
расширяет язык С. Даже если вы намерены писать исходный код, придерживаясь ANSI-стандарта этого языка, некоторые расширения
gcc
просто необходимо знать для понимания заголовочных файлов Linux.

Большинство опций командной строки такие же, как применяемые в компиляторах С. Для некоторых опций никаких стандартов не предусмотрено. В этой главе мы охватим наиболее важные опции, которые используются в повседневном программировании.

Стремление соблюсти ISO-стандарт С весьма полезно, но в связи с тем, что С является низкоуровневым языком, встречаются ситуации, когда стандартные средства недостаточно выразительны. Существуют две области, в которых широко применяются расширения

gcc
: взаимодействие с ассемблерным кодом (эти вопросы раскрываются по адресу и сборка совместно используемых библиотек (см. главу 8). Поскольку заголовочные файлы являются частью совместно используемых библиотек, некоторые расширения проявляются также в системных заголовочных файлах.

Конечно, существует еще множество расширений, полезных в любом другом виде программирования, которые могут очень даже помочь при кодировании. Дополнительную информацию по этим расширениям можно найти

в документации
gcc
в формате Texinfo.

5.1. Опции

gcc

gcc
принимает множество командных опций. К счастью, набор опций, о которых действительно нужно иметь представление, не так велик, и в этой главе мы его рассмотрим.

Большинство опций совпадают или подобны опциям других компиляторов,

gcc
включает в себя огромную документацию по своим опциям, доступную через info gcc (
man gcc
также выдает эту информацию, однако man-страницы не обновляются настолько часто, как документация в формате Texinfo).

Поделиться с друзьями:
– о имя_файла
Указывает имя выходного файла. Обычно в этом нет необходимости, если осуществляется компиляция в объектный файл, то есть по умолчанию происходит подстановка
имя_файла
на
имя_файла
. Однако если вы создаете исполняемый файл, по умолчанию (по историческим причинам) он создается под именем
а.out
. Это также полезно в случае, когда требуется поместить выходной файл в другой каталог.
– с
Компилирует без компоновки исходный файл, указанный для командной строки. В результате для каждого исходного файла создается объектный файл. При использовании
make
компилятор
gcc
обычно вызывается для каждого объектного файла; таким образом, в случае возникновения ошибки легче обнаружить, какой файл не смог скомпилироваться. Однако если вы вручную набираете команды, часто в одном вызове
gcc
указывается множество файлов. В случае, если при задании множества файлов в командной строке может возникнуть неоднозначность, лучше указать только один файл. Например, вместо
gcc -с -о а.о а.с b.с
имеет смысл применить
gcc -с -o a.o b.c
.
– Dfoo
Определяет препроцессорные макросы в командной строке. Возможно, потребуется отменить символы, трактуемые оболочкой как специальные. Например, при определении строки следует избегать употребления ограничивающих строки символов
"
. Вот два наиболее употребляемых способа:
'-Dfoo="bar"'
и
– Dfoo=\"bar\"
. Первый способ работает намного лучше, если в строке присутствуют пробелы, поскольку оболочка рассматривает пробелы особым образом.
– Iкаталог
Добавляет каталог в список каталогов, в которых производится поиск включаемых файлов.
– Lкаталог
Добавляет каталог в список каталогов, в которых производится поиск библиотек,
gcc
будет отдавать предпочтение совместно используемым библиотекам, а не статическим, если только не задано обратное.
– lfoo
Выполняет компоновку с библиотекой
libfoo
. Если не указано обратное,
gcc
отдает предпочтение компоновке с совместно используемыми библиотеками (
libfoo.so
), а не статическими (
libfoo.a
). Компоновщик производит поиск функций во всех перечисленных библиотеках в том порядке, в котором они перечислены. Поиск завершается тогда, когда будут найдены все искомые функции.
– static
Выполняет компоновку с только статическими библиотеками. См. главу 8.
– g
,
– ggdb
Включает отладочную информацию. Опция
– g
заставляет
gcc
включить стандартную отладочную информацию. Опция
– ggdb
указывает на необходимость включения огромного количества информации, которую в силах понять лишь отладчик
gdb
.
Если дисковое пространство ограничено или вы хотите пожертвовать некоторой функциональностью ради скорости компоновки, следует использовать
– g
. В этом случае, возможно, придется воспользоваться другим отладчиком, а не
gdb
. Для максимально полной отладки необходимо указывать
– ggdb
. В этом случае
gcc
подготовит максимально подробную информацию для
gdb
. Следует отметить, что в отличие от большинства компиляторов,
gcc
помещает некоторую отладочную информацию в оптимизированный код. Однако трассировка в отладчике оптимизированного кода может быть сопряжена со сложностями, так как во время выполнения могут происходить прыжки и пропуски фрагментов кода, которые, как ожидалось, должны были выполняться. Тем не менее, при этом можно получить хорошее представление о том, как оптимизирующие компиляторы изменяют способ выполнения кода.
– O
,
– On
Заставляет gcc оптимизировать код. По умолчанию,
gcc
выполняет небольшой объем оптимизации; при указании числа (
n
) осуществляется оптимизация на определенном уровне. Наиболее распространенный уровень оптимизации — 2; в настоящее время в стандартной версии gcc самым высоким уровнем оптимизации является 3. Мы рекомендуем использовать
– O2
или
– O3
;
– O3
может увеличить размер приложения, так что если это имеет значение, попробуйте оба варианта. Если для вашего приложения важна память и дисковое пространство, можно также использовать опцию
– Os
, которая делает размер кода минимальным за счет увеличения времени выполнения.
gcc
включает встроенные функции только тогда, когда применяется хотя бы минимальная оптимизация (
– O
).