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.

Классический анализ покрытия (original tcov)

Исходный код компилируется с опцией -xa для C и -a для программ на Fortran и C++. Компилятор создаёт для каждого объектного файла файл данных покрытия с расширением .d. Этот файл размещается в каталоге, определённом переменной среды TCOVDIR. Если TCOVDIR не определён, файл создаётся в текущем каталоге. После выполнения программы и завершения работы файлы .d обновляются. Затем выполняется команда tcov для генерации аннотированных файлов. Синтаксис команды:

tcov options source-file-list

Где source-file-list — список имён исходных файлов. По умолчанию вывод tcov — файлы с суффиксом .tcov, который можно изменить с помощью опции -o. Программу, собранную с поддержкой анализа покрытия, можно запускать многократно (с разными входными данными); tcov можно запускать после каждого запуска для сравнения поведения.

Расширенный анализ покрытия (enhanced 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 работает в классическом режиме.

Примечания