10.3 Использование gcov с оптимизацией GCC
Если вы планируете использовать gcov для оптимизации кода, необходимо сначала скомпилировать программу с двумя специальными опциями GCC: ‘-fprofile-arcs -ftest-coverage’. Помимо этого, вы можете использовать любые другие опции GCC; но если вы хотите убедиться, что каждая строка в вашей программе была выполнена, не следует компилировать с оптимизацией. На некоторых машинах оптимизатор может удалить некоторые простые строки кода, объединив их с другими строками. Например, код такого вида:
if (a != b) c = 1; else c = 0;
может быть скомпилирован в одну инструкцию на некоторых машинах. В этом случае у gcov нет возможности рассчитать отдельные счётчики выполнения для каждой строки, так как для каждой строки нет отдельного кода. Поэтому вывод gcov будет выглядеть так, если вы скомпилируете программу с оптимизацией:
100: 12:if (a != b) 100: 13: c = 1; 100: 14:else 100: 15: c = 0;
Вывод показывает, что этот блок кода, объединённый оптимизацией, был выполнен 100 раз. В некотором смысле этот результат верен, потому что была только одна инструкция, представляющая все четыре строки. Однако вывод не указывает, сколько раз результат был 0 и сколько раз результат был 1.
Встраиваемые функции могут создавать неожиданные счётчики строк. Счётчики строк отображаются для исходного кода встраиваемой функции, но то, что отображается, зависит от того, где функция встраивается, или вообще не встраивается.
Если функция не встраивается, компилятор должен сгенерировать внестрочный экземпляр функции в любом объектном файле, которому это необходимо. Если fileA.o и fileB.o оба содержат внестрочные тела определённой встраиваемой функции, они оба также будут содержать счётчики покрытия для этой функции. Когда fileA.o и fileB.o связываются вместе, компоновщик на многих системах выберет одно из этих внестрочных тел для всех вызовов этой функции и удалит или проигнорирует другое. К сожалению, он не удалит счётчики покрытия для неиспользуемого тела функции. Поэтому при инструментировании все, кроме одного использования этой функции, будут показывать нулевые счётчики.
Если функция встраивается в нескольких местах, структура блока в каждом месте может быть разной. Например, условие может быть вычислено на этапе компиляции в некоторых случаях. Поскольку покрытие всех использований встраиваемой функции отображается для одних и тех же строк исходного кода, счётчики строк сами по себе могут показаться несогласованными.
Приложения с длительным временем выполнения могут использовать _gcov_reset и _gcov_dump средства для ограничения сбора профилей областью программы, представляющей интерес. Вызов _gcov_reset(void) сбросит все счётчики профиля в ноль, а вызов _gcov_dump(void) вызовет дамп собранной в этот момент профильной информации в выходные файлы .gcda.
Далее: Файлы данных Gcov, Предыдущее: Вызов Gcov, Вверх: Gcov [Оглавление][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-5.5.0/gcc/Gcov-and-Optimization.html