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: количество миллисекунд, на протяжении которых функция выполнялась;