Я хочу создать отчет о покрытии для моего github repo , это большой проект на C ++, созданный с помощью CMake.
Я добавляю --coverage (равно -fprofile-arcs -ftestопция -coverage) для сборки g ++ и связывания аргументов в моем CMakeLists.txt , и я использую gcov для генерации данных покрытия кода и загрузки данных в codecov.io.
Эти автоматические сборки и тесты выполняются в моем CI Jenkins. Связанный код оболочки выполнения Jenkins находится здесь:
cmake -DCODE_COVERAGE=ON -Dasan=OFF -DNEBULA_ASAN_PRELOAD= ..
make -j8
ctest -j8
#generate code coverage report and upload it to codecov.io
TEST_FILES=$(find . -name '*.cpp.o')
#gcov -abcr $TEST_FILES
for test_file in $TEST_FILES; do gcov -abcr $test_file; done
curl -s https://codecov.io/bash | bash -s - -t c85ebdca-ec7c-4301-a6ed-7967cf175db5
Когда Jenkins оправдывает make -j8 и ctest -j8 и gcov -abcr $test_file Я получаю связанные файлы .gcno, файлы .gcda и файлы gcov. Но когда Дженкинс извиняет curl -s https://codecov.io/bash |bash -s - -t c85ebdca-ec7c-4301-a6ed-7967cf175db5 для загрузки файлов данных в кодеки, вывод выглядит странно. Я вижу много подобных ошибок, таких как:
ExecutionPlan.gcno:'_ZNK6nebula4cpp29ValueType8get_typeEv' has arcs to entry block
ExecutionPlan.gcno:'_ZNK6nebula4cpp29ValueType8get_typeEv' has arcs from exit block
И опция -r gcov, похоже, не работает, потому что я также получаю много отчетов о покрытии системных заголовочных файлов.
И наконец Дженкинс сообщает мне, что сборка не удалась, поэтому я не вижу отчет о покрытии в кодеках.
Ps:
- Исходный cppФайлы не находятся в одном каталоге с файлами .cpp.o (тип объекта Cake по умолчанию в C ++ - .cpp.o, а не .o). И я делаю приведенный выше точный код оболочки в каталоге build , файлы .gcno, .gcda и .gcov генерируются в одном каталоге.
- Поскольку тип объекта CMake по умолчанию -.cpp.o, сгенерированный тип файлов gcno и gcda: .cpp.gcno и .cpp.gcdas. Поэтому я использую gcov filename.cpp.o вместо gcov filename.cpp, который скажет мне не удалось открыть файл filename.gcno ошибки.
- Я провожу несколько экспериментов, чтобы найти причину ошибок,Я нахожу, когда я даю gcov один входной файл, такой как gcov 1.cpp.o , я не получаю дуг из ошибок блока выхода , но когда я даю gcov более одного входного файлакак gcov 1.cpp.o 2.cpp.o , я получаю ошибки имеет дуги из выходного блока . Я думаю, что, вероятно, причина в расчесывании нескольких файлов gcov.