gcov для больших проектов (статические библиотеки, ...)

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

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 ответа

  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

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

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

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

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

gcov -o Source/MyA Source/MyA/aa.cpp

Если вы тщательно и вручную выполнили тестирование своего продукта или приложения и потратили на него много сил. Если ваша цель - получить отчет о покрытии кода, используя 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

Если вы перейдете непосредственно в 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

перейти к 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 охват.info; genhtml cover.info - выходной-каталог / var / www / html / покрытие

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

Другие вопросы по тегам