Разработка приложений в среде Linux. Второе издание
Шрифт:
Команда
Выполняет инструкции программы до достижения новой строки исходного кода. См.
Выполняет в точности одну инструкцию машинного языка; с заходом внутрь функций. См.
Если выдана без аргумента, отменяет все отображения. В противном случае отменяет отображения указанные номерами. См.
Выводит тип данных выражения, переданного в качестве аргумента команды.
См.
Команда
4.4. Действия при трассировке программы
Существуют две программы, помогающие трассировать исполняемые файлы. Ни одной из этих программ исходный код не нужен; фактически, они не могут использовать исходные коды. Обе программы выводят в символьной текстовой форме журнал действий, выполняемых приложением.
Первая,
Например, предположим, что имеется системный демон, функционирующий уже некоторое время, который начал выдавать ошибки сегментации. Скорее всего, это вызвано изменением в некоторых файлах данных, но неизвестно каких именно. Первым шагом должен быть запуск системного демона под управлением
Подобно
Обе утилиты поддерживают похожий набор опций.
– С или – -demangle | Только для ltrace . Декодирует (или расшифровывает) имена библиотечных символов в читабельные имена. В результате убираются начальные символы подчеркивания (многие функции glibc имеют внутренние имена с начальными символами подчеркивания) и функции библиотеки С++ становятся более читабельными (С++ шифрует информацию о типе в символьные имена). |
– е | Только для strace . Указывает подмножество вызовов, которые нужно вывести. Существует множество возможных спецификаций, описанных на man-странице strace ; самой распространенной спецификацией является – е trace=file , которая трассирует только системные вызовы, связанные с файловым вводом-выводом и обработкой файлов. |
– f | Пытается «следовать вызову fork », по возможности трассируя дочерние процессы. Обратите внимание, что дочерний процесс может некоторое время работать без трассировки до тех пор, пока strace или ltrace сможет подключиться к нему и трассировать его действия. |
– о имя_файла | Вместо вывода на стандартное устройство вывода выводит в файл имя файла. |
– р pid | Вместо запуска нового экземпляра программы подключается к процессу с идентификатором pid . |
– S | Только для ltrace . Отслеживает системные и библиотечные вызовы. |
– v | Только для strace . Не сокращает большие структуры в системных вызовах вроде семейства вызовов stat , termios и так далее. |
На man-страницах утилит можно найти описание этих и других опций, здесь не упомянутых.
Глава 5
Опции и расширения
Для правильного использования
Большинство опций командной строки такие же, как применяемые в компиляторах С. Для некоторых опций никаких стандартов не предусмотрено. В этой главе мы охватим наиболее важные опции, которые используются в повседневном программировании.
Стремление соблюсти ISO-стандарт С весьма полезно, но в связи с тем, что С является низкоуровневым языком, встречаются ситуации, когда стандартные средства недостаточно выразительны. Существуют две области, в которых широко применяются расширения
Конечно, существует еще множество расширений, полезных в любом другом виде программирования, которые могут очень даже помочь при кодировании. Дополнительную информацию по этим расширениям можно найти
в документации5.1. Опции
Большинство опций совпадают или подобны опциям других компиляторов,
– о имя_файла | Указывает имя выходного файла. Обычно в этом нет необходимости, если осуществляется компиляция в объектный файл, то есть по умолчанию происходит подстановка имя_файла.с на имя_файла.о . Однако если вы создаете исполняемый файл, по умолчанию (по историческим причинам) он создается под именем а.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 ). |