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