Tcov
Tcov — инструмент анализа покрытия исходного кода и профилирования по операторам для программ, написанных на Fortran, C и C++. Также tcov осуществляет точный подсчёт количества выполнений каждого оператора программы и аннотирует исходный код средствами добавления инструментирующих конструкций. Tcov является стандартной утилитой, предоставляемой бесплатно с программным обеспечением Sun Studio.
Что важно знать
| Tcov | |
|---|---|
| Тип | анализ покрытия кода |
| Разработчик | Oracle Corporation |
| Операционная система | Solaris |
| Аппаратная платформа | SPARC |
| Лицензия | Бесплатно для загрузки и использования согласно лицензии продукта Sun Studio (CDDL) |
| Сайт | developers.sun.com/sunst… |
Описание
Утилита tcov предоставляет информацию о частоте выполнения участков программного кода. Она создаёт копию исходного файла с аннотациями о частоте исполнения. Аннотирование кода может производиться на уровне базовых блоков или отдельных строк исходного кода. Так как все операторы в базовом блоке выполняются одинаковое количество раз, счётчик выполнения блока равен числу исполнений каждого оператора в этом блоке. Утилита tcov не предоставляет данных, основанных на измерении времени.
Tcov формирует анализ покрытия кода для скомпилированной программы. В качестве аргументов tcov принимает исходные файлы и выдаёт аннотированный листинг. Каждый базовый блок (или строка, при соответствующей опции) предваряется числом исполнений; строки, которые не были выполнены, предваряются «#####».
Также tcov добавляет в конце листинга итоговую сводку. В ней перечислены наиболее часто выполнявшиеся базовые блоки в порядке убывания частоты выполнения. Номер строки равен номеру первой строки блока.
Существуют две реализации tcov:
- Классический анализ покрытия:[1] В этой реализации, также называемой original tcov, компилятор создаёт файл данных покрытия с суффиксом .d для каждого объектного файла. После завершения работы программы эти файлы данных обновляются.
- Расширенный анализ покрытия:[2] В этой реализации, также известной как enhanced tcov, на этапе компиляции дополнительные файлы не создаются. Вместо этого создаётся каталог для хранения профиля, и в нём создаётся единый файл данных покрытия под названием tcovd.
Расширенный анализ tcov исправляет недостатки оригинального анализа, включая:[3]
- Более полная поддержка языка C++.
- Поддержка кода в подключаемых заголовочных файлах и исправление ошибок, скрывающих информацию о покрытии шаблонных классов и функций.
- Более эффективная работа по сравнению с классическим tcov.
- Поддерживается на всех платформах, поддерживаемых компиляторами.
Реализация
Для генерации аннотированного исходного кода необходимы следующие три шага:[4]
- Компиляция кода с соответствующей опцией компилятора
- Выполнение программы для накопления данных профилирования
- Запуск команды tcov для генерации аннотированных файлов
Каждый следующий запуск программы накапливает новые данные покрытия в файле профиля. Для каждого объектного файла данные обнуляются при первом запуске программы после перекомпиляции. Данные по всей программе можно сбросить, удалив файл tcovd[5].
Ниже эти шаги рассматриваются для оригинальной и расширенной версий tcov.
Исходный код компилируется с опцией -xa для C и -a для программ на Fortran и C++. Компилятор создаёт для каждого объектного файла файл данных покрытия с расширением .d. Этот файл размещается в каталоге, определённом переменной среды TCOVDIR. Если TCOVDIR не определён, файл создаётся в текущем каталоге. После выполнения программы и завершения работы файлы .d обновляются. Затем выполняется команда tcov для генерации аннотированных файлов. Синтаксис команды:
tcov options source-file-list
Где source-file-list — список имён исходных файлов. По умолчанию вывод tcov — файлы с суффиксом .tcov, который можно изменить с помощью опции -o. Программу, собранную с поддержкой анализа покрытия, можно запускать многократно (с разными входными данными); tcov можно запускать после каждого запуска для сравнения поведения.
Исходный код компилируется с опцией -xprofile=tcov. В отличие от классического режима, расширенный tcov не генерирует файлов на этапе компиляции[6]. После выполнения программы создаётся каталог для хранения профиля, и в нём создаётся единый файл данных покрытия — tcovd. Файл tcovd содержит информацию о номерах строк и количестве исполнений; это файл в текстовом формате. Стандартно каталог создаётся там, где запускалась программа, его имя формируется по имени исполняемого файла с суффиксом .profile. Такой каталог также называют «profile bucket». Для смены каталога профиля можно использовать переменные среды SUN_PROFDATA_DIR или SUN_PROFDATA. Затем tcov запускается для генерации аннотированных файлов, синтаксис команды тот же, но добавляется обязательная опция -x:
tcov options -x profilebucket source-file-list
Единственным отличием является обязательная опция -x dir, обозначающая каталог профиля для enhanced tcov.
Пример
Следующая программа на C, выполняет итерацию по целым числам от 1 до 9 и тестирует их делимость с помощью оператора остатка от деления (%):
#include <stdio.h>
int
main (void)
{
int i;
for (i = 1; i < 10; i++)
{
if (i % 3 == 0)
printf ("%d is divisible by 3\n", i);
if (i % 11 == 0)
printf ("%d is divisible by 11\n", i);
}
return 0;
}
Для анализа покрытия программа должна быть собрана со следующими опциями:
для классического режима анализа:
cc -xa cov.c
и для расширенного режима анализа:
cc -xprofile=tcov -o cov cov.c
где cov.c — имя файла программы. Это создаёт инструментированный исполняемый файл, содержащий дополнительные инструкции для регистрации числа выполнений каждой строки программы. Опция -o используется для задания имени исполняемого файла. Затем программа запускается для генерации файла покрытия; способ и место создания файлов различаются для классического и расширенного режимов. В классическом режиме файл с расширением .d создаётся после компиляции, либо в каталоге TCOVDIR, либо в текущем каталоге, и обновляется по завершении выполнения. В расширенном режиме файл tcovd создаётся в каталоге <имя исполняемого файла>.profile. Анализ данных выполняется командой tcov с указанием исходного файла:
для классического режима:
tcov cov.c
для расширенного режима:
tcov -x cov.profile cov.c
Добавочный аргумент в расширенном режиме — это «profile bucket». Команда tcov создаёт аннотированную версию исходного файла с расширением «.tcov», где приводятся количества исполнений строк:
#include <stdio.h>
int
main (void)
{
1 int i;
10 for (i = 1; i < 10; i++)
{
9 if (i % 3 == 0)
3 printf ("%d is divisible by 3\n", i);
9 if (i % 11 == 0)
###### printf ("%d is divisible by 11\n", i);
9 }
1 return 0;
1 }
Tcov также добавляет в конец листинга итоговую сводку: статистика по базовым блокам приводится в порядке убывания частоты выполнения. Номер строки соответствует первой строке блока.
Опции командной строки
Утилита tcov поддерживает следующие опции при генерации аннотированных файлов по данным профиля:[7]
- -a — выводит счётчик исполнений для каждой строки (по умолчанию только для ведущих операторов блока).
- -n — выводит таблицу номеров n наиболее часто выполняемых строк и число их исполнений.
- -o filename — вывод в указанный файл вместо file.tcov; можно перенаправить вывод в стандартный поток, указав «-».
- -x dir — поддерживается только в расширенном режиме анализа; если не указано, tcov работает в классическом режиме.


