Гков
Gcov — это инструмент для анализа покрытия исходного кода по каждому оператору и профилирования . Gcov генерирует точные подсчеты количества выполнения каждого оператора в программе и аннотирует исходный код для добавления инструментов. Gcov входит в стандартную утилиту пакета GNU Compiler Collection (GCC). [1]
Утилита gcov предоставляет информацию о том, как часто программа выполняет сегменты кода. [2] Он создает копию исходного файла с указанием частоты выполнения. Утилита gcov не создает никаких данных на основе времени и работает только с кодом, скомпилированным с помощью пакета GCC. В руководстве утверждается, что оно несовместимо с каким-либо другим механизмом профилирования или тестового покрытия. [3] но он работает и с файлами, сгенерированными llvm . [4]
Описание
[ редактировать ]gcov производит анализ тестового покрытия специально оснащенной программы . Варианты -fprofile-arcs -ftest-coverage
должен использоваться для компиляции программы анализа покрытия (первый вариант для записи статистики ветвей и второй для сохранения количества выполненных строк); -fprofile-arcs
также следует использовать для связи программы. [2] После запуска такая программа создаст несколько файлов с расширениями (суффиксами) «.bb», «.bbg» и «.da», которые можно проанализировать с помощью gcov. Он принимает исходные файлы в качестве аргументов командной строки и создает аннотированный исходный список. Перед каждой строкой исходного кода указывается количество ее выполнений; строки, которые не были выполнены, имеют префикс «#####». [2]
gcov создает файл журнала с именем sourcefile.gcov , который указывает, сколько раз каждая строка исходного файла sourcefile.c выполнялась . Этот аннотированный исходный файл можно использовать с gprof , другим инструментом профилирования, для извлечения информации о времени работы программы.
Пример
[ редактировать ]Следующая программа, написанная на 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;
}
Чтобы включить тестирование покрытия, программа должна быть скомпилирована со следующими опциями:
$ gcc -Wall -fprofile-arcs -ftest-coverage cov.c
где cov.c — имя файла программы. При этом создается инструментированный исполняемый файл , который содержит дополнительные инструкции, записывающие количество выполнений каждой строки программы. Вариант -ftest-coverage добавляет инструкции для подсчета количества выполнения отдельных строк, а -fprofile-arcs включает код инструментирования для каждой ветви программы. Инструментарий ветвей записывает, как часто используются разные пути через операторы «if» и другие условные выражения.
Затем можно запустить исполняемый файл для анализа кода и создания данных о покрытии.
$ ./a.out
Данные прогона записываются в несколько файлов данных покрытия с расширениями «.bb», «.bbg» и «.da» соответственно в текущем каталоге .
Если выполнение программы зависит от входных параметров или данных, ее можно запускать несколько раз, а результаты будут накапливаться в файлах данных покрытия для общего анализа.
Эти данные можно проанализировать с помощью команды gcov и имени исходного файла:
$ gcov cov.c
88.89% of 9 source lines executed in file cov.c
Creating cov.c.gcov
Команда gcov создает аннотированную версию исходного файла с расширением .gcov, содержащую количество выполнений каждой строки:
#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 }
Количество строк можно увидеть в первом столбце вывода. Строки, которые не были выполнены, отмечены хешем «######».
Параметры командной строки
[ редактировать ]![]() | Этот раздел может содержать чрезмерное количество сложных деталей, которые могут заинтересовать только определенную аудиторию . ( Октябрь 2020 г. ) |
Утилита командной строки Gcov поддерживает следующие параметры при создании файлов с аннотациями из данных профиля: [5] [6]
- -h ( --help ): Отобразить справку об использовании gcov (в стандартном выводе) и выйти без дальнейшей обработки.
- -v ( --version ): отобразить номер версии gcov (в стандартном выводе) и выйти без дальнейшей обработки.
- -a ( --all-blocks ): записать индивидуальное количество выполнений для каждого базового блока. Обычно gcov выводит количество выполнений только для основных блоков строки. С помощью этой опции вы можете определить, не выполняются ли блоки внутри одной строки.
- -b ( --branch-probabilities ): записать частоты ветвей в выходной файл и записать сводную информацию о ветках в стандартный вывод. Эта опция позволяет вам увидеть, как часто выполнялась каждая ветвь вашей программы. Безусловные переходы не будут отображаться, если не указана опция -u.
- -c ( --branch-counts ): Записывать частоту ветвей как количество выбранных ветвей, а не в процентах.
- -n ( --no-output ): не создавать выходной файл gcov.
- -l ( --long-file-names ): создавать длинные имена файлов для включенных исходных файлов. Например, если файл заголовка xh содержит код и был включен в файл ac, то запуск gcov для файла ac приведет к созданию выходного файла с именем ac##xhgcov вместо xhgcov. Это может быть полезно, если xh включен в несколько исходных файлов и вы хотите увидеть отдельные вклады. Если вы используете опцию «-p», имена включаемых и включаемых файлов будут полными именами путей.
- -p ( --preserve-paths ): сохранять полную информацию о пути в именах сгенерированных файлов .gcov. Без этой опции используется только компонент имени файла. При использовании этой опции используются все каталоги, в которых символы `/' преобразуются в символы `#', . компоненты каталога удалены и не подлежат удалению.. компоненты переименованы в `^'. Это полезно, если исходные файлы находятся в нескольких разных каталогах.
- -r ( --relative-only ): выводить информацию об исходных файлах только с относительным именем пути (после исключения префикса источника). Абсолютные пути обычно представляют собой системные заголовочные файлы, и покрытие любых встроенных функций в них обычно неинтересно.
- -f ( --function-summaries ): выходные сводки для каждой функции в дополнение к сводке на уровне файла.
- -o каталог|файл ( --object-directory каталог или --object-file файл ): укажите либо каталог, содержащий файлы данных gcov, либо имя пути к объекту. С помощью этой опции осуществляется поиск файлов данных .gcno и .gcda. Если указан каталог, файлы данных находятся в этом каталоге и называются по имени входного файла без его расширения. Если здесь указан файл, файлы данных называются в честь этого файла без его расширения.
- Каталог -s ( каталог --source-prefix ): префикс для имен исходных файлов, который необходимо удалить при создании выходных файлов покрытия. Эта опция полезна при сборке в отдельном каталоге, а путь к исходному каталогу не требуется при определении имен выходных файлов. Обратите внимание, что это обнаружение префикса применяется до определения того, является ли исходный файл абсолютным.
- -u ( --unconditional-branches ): если заданы вероятности ветвей, включаются вероятности безусловных ветвей. Безусловные переходы обычно не интересны.
- -d ( --display-progress ): отображать прогресс на стандартном выводе.
Резюме покрытия
[ редактировать ]Lcov — это графический интерфейс для gcov. Он собирает данные gcov для нескольких исходных файлов и создает HTML- страницы, содержащие исходный код с информацией о покрытии. Он также добавляет обзорные страницы для удобной навигации по файловой структуре. Lcov поддерживает измерение операторов, функций и покрытия ветвей. [7] Существует также версия для Windows.
Gcovr предоставляет утилиту для управления использованием gcov и генерации обобщенных результатов покрытия кода. Эта команда основана на пакете Python Cover.py, который предоставляет аналогичную утилиту в Python. Gcovr создает либо компактные, удобочитаемые сводные отчеты, машиночитаемые XML-отчеты, либо графические сводные HTML-отчеты. Отчеты XML, созданные gcovr, могут использоваться Jenkins для предоставления графических сводок покрытия кода. Gcovr поддерживает измерение покрытия операторов и ветвей. [8]
SCov — это утилита, которая обрабатывает промежуточный текстовый формат, сгенерированный gcov (с использованием gcov -i), для создания отчетов о покрытии кода. Эти отчеты могут представлять собой простой текстовый отчет или HTML- страницы с более подробными отчетами. [9]
См. также
[ редактировать ]- Tcov — инструмент покрытия кода для Solaris, входящий в пакет Sun Studio.
Ссылки
[ редактировать ]- ^ «Как работает Gcov — инструментальная часть GCC» (PDF) . Архивировано из оригинала (PDF) 9 апреля 2014 г. Проверено 12 февраля 2012 г.
{{cite journal}}
: Для цитирования журнала требуется|journal=
( помощь ) - ^ Jump up to: а б с Брайан Дж. Гоф. Введение в GCC — для компиляторов GNU gcc и g++ — Тестирование покрытия с помощью gcov . Проверено 12 февраля 2012 г.
- ^ «Справочная страница gcov» . Проверено 12 февраля 2012 г.
- ^ "gcov llvm" . Проверено 12 ноября 2022 г.
- ^ gnu.org. «Параметры командной строки Gcov» . Проверено 11 февраля 2012 г.
- ^ команды Linux. «Параметры командной строки Gcov» . Архивировано из оригинала 23 мая 2012 г. Проверено 12 февраля 2012 г.
- ^ «Льков» .
- ^ «Гковр» .
- ^ «СКов» .