Операционные инструменты *nix-кодера

Иван Скляров

Хакер, номер #072, стр. 072-104-1

(Sklyarov@real.xakep.ru, www.sklyaroff.ru)

Обзор стандартных консольных GNU developer Tools

Я ничего не буду рассказывать о таких программах, как emacs и vi, т.к. текстовый редактор - это дело вкуса. Обойду стороной и такие утилиты, как tcpdump и netstat, т.к. они в первую очередь предназначены для системных администраторов. Так о каких же утилитах сегодня пойдет речь? О тех, которые предназначены исключительно для разработчиков приложений и стандартно присутствуют в большинстве *nix-систем.

Тонкости профилирования

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

Воспользоваться gprof просто. Сначала компилится и компонуется программа с опциями профилирования, причем для языка Си в опциях gcc должен быть указан флаг –pg. Затем программа запускается, в результате чего генерятся профильные данные и скидываются в файл gmon.out. Замечу, что профильный файл не появится, если программа завершится аварийно, т.е. твоя прога должна быть уже отлажена. Последним этапом запускается сам gprof, которому нужно передать имя исполняемого файла. Gprof проанализирует файл gmon.out и выдаст информацию о том, сколько времени заняло выполнение каждой функции. В общем случае информация будет состоять из двух таблиц — «Простой профиль» («Flat profile») и «Граф вызовов» («Call graph») - с замечаниями, кратко объясняющими их содержимое. Простой профиль показывает, сколько времени выполнялась каждая функция и сколько раз она вызывалась. По нему легко установить, какие функции программы затрачивают больше всего времени. Граф вызовов может подсказать те места, в которых стоит попытаться исключить вызовы функций, требующие много времени на выполнение, - здесь показано для каждой функции, какие функции ее вызывали, какие функции вызывала она сама и сколько раз. Также здесь есть информация, сколько времени было затрачено на выполнение подпрограмм в каждой функции.

Утилита gprof имеет множество полезных опций, например, при задании опции –A будет отображен исходный текст программы с процентными показателями времени выполнения.

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

$ gcc -pg -o program program.c

$ ./program

$ gprof ./program

В погоне за временем

Утилита time показывает время, затраченное на выполнение программы. Пример:

$ time ./program

real 0m0.008s

user 0m0.001s

sys 0m0.010s

Real — астрономическое время, в течение которого выполнялась программа; user — время центрального процессора, потраченное на исполнение программы; sys — время, затраченное на программу операционной системой. Понятно, что буква m указывает минуты, а s — секунды в десятичных дробях. Если нужно отследить время выполнения программ, которые используют каналы, то утилиту time следует использовать так:

$ time /bin/sh -c "program –flag1 -flag2 | program2"

Содержание  Вперед на стр. 072-104-2
ttfb: 3.0620098114014 ms