Linux: Полное руководство
Шрифт:
Формат вызова команды strace следующий:
Ключи программы перечислены в таблице 22.3.
Ключи командной строки strace Таблица 22.3
| Ключ | Назначение |
|---|---|
| – с | Подсчитывать время, затраченное на каждый вызов и обработку ошибок. В конце трассировки будет представлен подробный отчет |
| – d | Выводить отладочные сообщения самой программы strace на стандартный вывод ошибки |
| – f | Трассировать дочерние процессы, созданные уже трассируемыми процессами |
| – ff | Данная опция применятся только вместе с опцией -o имя_файла. Каждый трассируемый процесс будет записан в файл имя_файла.pid |
| – F | Следовать вызовам vfork. Данную опцию нельзя использовать вместе с опцией -f |
| – h | Вывести
|
| – i | Выводить указатель инструкции во время системного вызова |
| – q | «Тихий режим». Подавляет вывод некоторых сообщений |
| – r | Выводить относительную метку времени для каждого вызова |
| – t | Перед каждой строкой выводить текущее время |
| – tt | То же, что и -t, но будут выводиться также микросекунды |
| – T | Показывать время, потраченное на системный вызов (то есть разницу между временем запуска и временем завершения вызова). Для каждого вызова |
| – v | Получение дополнительной информации |
| – V | Вывести номер версии strace |
| – X | Выводить не-ASCII строки в шестнадцатеричном формате |
| – XX | Выводить все строки в шестнадцатеричном формате |
| – a столбец | Выровнять возвращаемые вызовами значения в указанном столбце (по умолчанию 40) |
| – e выражение | Позволяет задать отслеживаемые события. За более подробной информацией обратитесь к справочной системе |
| – e trace=набор | Определить набор отслеживаемых вызовов. Например, trace=open,close,read,write |
| – e trace=file | Будут отслеживаться только вызовы для работы с файлами (open, stat, chmod, unlink и т.д.) |
| – e trace=process | Отслеживаются вызовы для работы с процессами (fork, exec, wait и др.) |
| – e trace=network | Отслеживаются сетевые вызовы |
| – e trace=signal | Отслеживаются вызовы для работы с сигналами |
| – e trace=ipc | Отслеживаются IPC-вызовы |
| – e abbrev=набор | Сокращает вывод каждого члена структуры. Например, abbrev=all или abbrev=none |
| – e verbose=набор | Различать структуры различных системных вызовов, по умолчанию verbose=all |
| – e raw=set | Выводит не декодированные значения аргументов системных вызовов. Данный аргумент полезен, если вы не доверяете декодированию или хотите знать точное числовое представление аргумента |
| – e signal=набор | Определяет набор трассируемых сигналов. По умолчанию signal=all. Вы можете использовать восклицательный знак для отрицания, например, signal=!SIGIO означает, что сигнал SIGIO не будет трассирован |
| – e read=набор | Выполнять полный шестнадцатиричный и ASCII-дамп всех прочитанных вызовом read данных. Например, чтобы видеть все данные, поступающие через дескрипторы 2 и 7, введите read=2,7 |
| – e write=набор | То же, что и -e read, но только для записи |
| – o имя_файла | Перенаправить вывод программы в указанный файл. Данный файл будет полезен для дальнейшего анализа трассировки |
| – p pid | Присоединиться к процессу с PID=pid и начать трассировку |
| – s размер | Установить максимальный размер строки (по умолчанию 32). Имена файлов не рассматриваются как строки, поэтому всегда будут напечатаны полностью |
| – S критерий | Сортирует вывод гистограммы, которая выводится опцией -с, по заданному критерию: time (время), calls (вызовы), name (имя) и nothing (без сортировки) |
| – u имя_пользователя | Запустить программу от имени указанного пользователя. Эта опция будет полезной, если вы, зарегистрировавшись как root, будете проверять корректность работы программы, если бы она была запущена под другим пользователем |
Вы даже не можете себе представить, какие системные вызовы использует такая маленькая программка:
Листинг 22.2. Файл prog.с
Откомпилируйте эту программу (
Вы увидите следующий вывод:
Читать
вызовы нужно так:В нашем случае мы вывели на консоль шесть символов, поэтому вызов write возвратит значение 6.
В случае, если системный вызов завершился неудачно (обычно код ошибки -1), программа strace выводит не только код, но и описание ошибки:
Стандартные константы выводятся в их символьном представлении:
Сигналы также выводятся в символьном представлении, например:
Структуры, точнее члены структур, заключаются в фигурные скобки и выводятся в формате имя_члена=значение, например:
Символьные указатели печатаются как строки в С, то есть их значения заключены в двойные кавычки:
22.5. Оптимизация программ. Профайлер gprof
Ваша программа работает медленно? Скорее всего, причина кроется в неэффективном, медленном алгоритме. Существуют программы, позволяющие определить время работы каждой функции вашей программы и всей программы в целом. Программы такого рода называются профайлерами. В вашем дистрибутиве может присутствовать один из профайлеров gprof, prof, profiler.
Сейчас мы рассмотрим программу gprof (The GNU Profiler), позволяющую определить время работы каждой функции. Основные ключи программы представлены в таблице 22.3.
Ключи командной строки gprof Таблица 22.3
| Ключ | Назначение |
|---|---|
| – а | He выводить информацию о статических функциях |
| – b | Не выводить описание каждого поля в итоговой таблице |
| – с | Включить эвристический анализ текстового сегмента объектного файла с целью создания статического графика вызовов |
| – e имя_функции | На выводить отчет о работе указанной функции и обо всех функциях, которые из нее вызываются |
| – E имя функции | Не обрабатывать указанную функцию и все функции, которые она вызывает |
| – f имя_функции | выводить информацию только об указанной функции и обо всех функциях, которые из нее вызываются |
| – F имя_функции | Обрабатывать только указанную функцию и все функции, которые из нее вызываются |
| – k func1 func2 | Не выводить информацию о вызове функции func2 из функции func1 |
| – s | Создание итогового файла gmon.sum |
| – z | Вывести функции с нулевым процессорным временем |
22.5.1. Использование профайлера
Для использования профайлера нужно скомпилировать программу с опцией компилятора – pg и без опции – о. так как профайлер по умолчанию работает с файлом
Без ключа – b профайлер выведет описание полей итоговой таблицы:
♦ Time: время работы функции в процентном соотношении;
♦ cumulative seconds: сумма числа секунд этой функции и вызывающих ее функций;
♦ self seconds: число секунд, потраченное на работу этой функции в отдельности;
♦ Calls: число вызовов;
♦ self ms/calls: количество миллисекунд, на протяжении которых функция выполнялась;