Каковы ваши советы по интерпретации выходных данных gcov для улучшения охвата? - PullRequest
5 голосов
/ 26 мая 2011

Я успешно использую gcov в моем проекте:

  • Я могу построить свой проект с помощью флагов gcov: -fprofile-arcs -ftest-coverage
  • Я связываюсь с опцией -lgcov
  • Я запускаю свою программу модульного тестирования, и создается много файлов gcda и gcno.
  • Я запускаю gcov много раз, и создается много файлов gcov.
  • Я суммирую результаты и выдаю список таких строк:
    • #####: 42: virtual double run_time() const { return 0; }

Тогда я пойду, дох! и напишите тест, который вызывает этот отсутствующий метод.

Приведенную выше строку примера довольно легко диагностировать - gcov сообщил мне точный метод, который я не вызывал.

У меня также был пример того, как конструктор копирования был помечен gcov, но я могу просмотреть его с помощью отладчика Visual Studio. Решение было заключаться в том, чтобы понять, что gcov страдает от RVO, который исключил копию, но пишет тест, который заставил копию исправить это.

У меня есть пара других примеров, которые я не могу понять:

1.
File.cpp
#####: 78:}

Кажется, gcov помечает закрывающую фигурную скобку пространства имен, которое является последней строкой файла.

2.
File.h
#####: 33:  class FooBase: public IResult {

Что gcov пытается сказать мне здесь? Я не могу думать о звонке, чтобы сделать здесь.
Обновление 1: Я обнаружил, что FooBase имеет конструктор по умолчанию, который, если только «вызывается» из подкласса, не то же самое, что вызывать его путем создания его экземпляра, что касается gcov .

Обновление 2: Я использовал djgpp/gcc 4.4.4, который привел к вышеуказанным результатам. Тем не менее, с помощью MinGW/gcc 4.5.2 «аберрации» исчезают, и, немного потрудившись, я смог достичь 100% покрытия линии.

Пожалуйста, напишите свои ответы с помощью одного совета для неосторожного пользователя gcov или ответа на один из моих примеров.

Ответы [ 3 ]

2 голосов
/ 02 августа 2015

Строка, о которой вы говорите, будет встроена в режиме релиза.Это означает, что сама строка никогда не будет подсчитана (хотя, откровенно говоря, приращение счетчика могло быть перемещено в место, где функция встроена ... но g ++ пока не делает этого.)

Для того, чтобыИсправьте проблему, добавив -g в командную строку g ++, чтобы сохранить отладку.Вы, вероятно, также хотите убедиться, что вы определили -D_DEBUG.На самом деле, документация обычно говорит вам использовать -g.

Наконец, вы хотите избежать оптимизаций с -O0.

С моей стороны, я хотел бы также использовать -fprofile-arcs и-ftest-coverage.

Как уже упоминалось в комментарии в другом ответе, использование -fno-elide-constructors и -fno-default-inline также может помочь с охватом «отсутствующих» конструкторов и встроенных функций.

В отношенииЕсли открывающая скобка помечена, g ++, скорее всего, создаст конструктор (возможно, конструктор копирования) и покажет его в строке объявления первого класса.Могут быть созданы и другие функции, специфичные для компилятора, и иногда просто невозможно поразить их без чрезвычайно сложных тестовых случаев ... Я сталкиваюсь с этой проблемой все время.

Как предложено hillatizer, вы можете использоватьlcov.Это дает вам HTML в качестве вывода с легко читаемыми таблицами, которые вы можете быстро просмотреть.У меня есть такой пример:

http://lcov.csspp.org/csspp-1.0.5/lib/index.html

Как мы видим, библиотека на 100% покрыта всеми тестами.Но почему-то файл assemblyr.cpp говорит, что одна функция не покрыта.Я понятия не имею, какая функция, хотя, поскольку 100% кода, который я написал, покрыта ... Так что я просто игнорирую такое.

2 голосов
/ 26 мая 2011

Как сказано в gcov.c

  /* For lines which don't exist in the .bb file, print '-' before
     the source line.  For lines which exist but were never
     executed, print '#####' before the source line.  Otherwise,
     print the execution count before the source line.  There are
     16 spaces of indentation added before the source line so that
     tabs won't be messed up.  */

Я предлагаю вам использовать отладочные сборки для gcov и VS при попытке получить покрытие.

1 голос
/ 17 сентября 2013

Недавно я использовал cmake + "make Experimental" + lcov. Я очень рекомендую эту комбинацию. Даже если вы не используете cmake, взгляните на lcov.

...