gcov для больших проектов (статические библиотеки, ...) - PullRequest
5 голосов
/ 07 апреля 2011

Я работаю над большим проектом, который имеет следующую структуру каталогов:

Source
 MyA
  aa.cpp
  ab.cpp
  ac.cpp
 MyB
  ba.cpp
  bb.cpp
  bc.cpp
 MyTest
  testaa.cpp
  testab.cpp
  testac.cpp
  testba.cpp
  testbb.cpp
  testbc.cpp
  main.cpp
Build
 MyA
  aa.o
  ab.o
  ac.o
  libMyA.a (static library)
 MyB
  ba.o
  bb.o
  bc.o
  libMyB.a (static library)
 MyTest
  testaa.o
  testab.o
  testac.o
  testba.o
  testbb.o
  testbc.o
  MyTest (executable)

После компиляции с -fprofile-arcs -ftest-coverage я запускаю приложение MyTest в каталоге Build / MyTest. Как и ожидалось, в каталоге Build находятся файлы * .gcno и * .gcda. После запуска gcov в каталоге MyTest создаются различные файлы * .gcov, но, к сожалению, не для всего внутри MyA и MyB, хотя каждая функция вызывается внутри этих двух библиотек. Пробовал разные варианты, но почему-то я не могу создать полезные (значит правильные) * .gcov файлы с этим макетом.

Если я копирую каждый cpp в один каталог и повторяю шаги, все работает как положено, и анализ покрытия идеален.

Ответы [ 3 ]

7 голосов
/ 20 ноября 2011
  1. Вы должны указать исходные файлы как абсолютные пути к g ++ / gcc.Не используйте относительные пути с ".." или как "foo / bar.cpp", иначе вы получите ошибки типа "geninfo: ПРЕДУПРЕЖДЕНИЕ: данные не найдены для XXXX".

  2. Не включайте никакие заголовочные файлы в командной строке в g ++ / gcc.В противном случае вы получите ошибки «несоответствие штампов с графическим файлом».

Поэтому при работе с несколькими каталогами должно работать следующее:

g++ --coverage -DDEBUG -g3 heyo.cpp /app/helper/blah.cpp /app/libfoo/foo.cpp -o program

./program

lcov --directory . --capture --output-file app.info

genhtml --output-directory cov_htmp app.info

Или, если выВ Makefile, который уже использует относительные пути, удобно использовать:

g++ --coverage -DDEBUG -g3 $(abspath heyo.cpp helper/blah.cpp ../foo/bar/baz.cpp) -o program
4 голосов
/ 10 апреля 2011

Чтобы сохранить структуру каталогов, вам нужно запустить gcov один раз в каждой папке с исходным файлом, но с помощью опции -o сообщить gcov, где находятся файлы данных.

Я думаю, что это должно быть так:

gcov -o ../../Build/MyA *.cpp

У меня есть проект с аналогичной структурой исходного файла, но я позволил компилятору записывать объектные файлы и т. Д. В исходные папки. Затем я запускаю gcov несколько раз из корневой папки, по одному разу для каждого исходного файла, но я указываю относительный путь к исходному файлу и использую опцию -o, чтобы указать относительную папку следующим образом:

gcov -o Source/MyA Source/MyA/aa.cpp
0 голосов
/ 28 февраля 2015

Если вы провели тщательное и ручное тестирование продукта или приложения и потратили на него много усилий. Если ваша цель - получить отчет о покрытии кода, используя lcov и gcov, но по ошибке удалили файлы gcno. Вы можете восстановить файлы gcno, перекомпилировав код, но он будет сгенерирован с новой отметкой времени, и gcov сообщит об ошибке, в которой говорится «несоответствие штампа с файлом графика», и отчет о покрытии кода не будет сгенерирован. Это приведет к потере всех ваших усилий по тестированию.

Существует ярлык для генерации отчета о покрытии кода. Это просто обходной путь, и на него нельзя полагаться все время. Рекомендуется сохранять файлы * .gcno до завершения тестирования.

Запишите вашу версию gcc (gcc -v) и загрузите ее исходный код с одного из зеркал. Например - ftp: //gd.tuwien.ac.at/gnu/sourceware/gcc/releases/gcc-4.4.6/gcc-4.4.6.tar.bz2

После извлечения загруженного файла gcc структура папок будет выглядеть следующим образом GCC-4.4.6 GCC-4.4.6 / НКУ

Если вы напрямую зайдете в gcc-4.4.6 / gcc и попытаетесь сделать ./configure и скомпилировать (сделать) оттуда, тогда вы столкнетесь с проблемой ниже build / genmodes -h> tmp-modes.h / bin / sh: build / genmodes: такого файла или каталога нет

Решением является do ./configure и make из gcc-4.4.6, и не будет отображаться никаких ошибок, связанных с genmodes. Это скомпилирует все модули, включая gcc. Возможно, вам придется установить модули mpfr и gmp, которые необходимы gcc, если обнаружена какая-либо ошибка ./configure

goto gcc-4.4.6 / gcc / gcov.c и прокомментируйте строки ниже, а затем перекомпилируйте с указанной выше командой

/*  if (tag != bbg_stamp)
    {
      fnotice (stderr, "%s:stamp mismatch with graph file\n", da_file_name);
      goto cleanup;
    }*/

Пример пути нового двоичного файла gcov после компиляции: gcc-4.4.6 / host-x86_64-unknown-linux-gnu / gcc / gcov

Поместите этот двоичный файл в / usr / bin и сгенерируйте отчет о покрытии кода командой, как показано в примере ниже lcov --capture --directory ./ - output-file cover.info; genhtml cover.info - выходной-каталог / var / www / html / покрытие

Теперь вы не должны получать ошибку «несоответствие штампа с графическим файлом», и вы получите отчет о покрытии кода правильно

...