lcov не работает должным образом для покрытия
Я пытаюсь получить покрытие html для теста, используя gcc 4.8.2 и lcov 1.10. Я уверен, что мои исходные тексты, объекты и файлы gcov находятся в одном месте и что я запускаю lcov из каталога, из которого также запускал мой компилятор.
Я получаю следующую ошибку:
$ lcov --capture --directory "objs/i386/MinGW/Os_SingleCore_SC3
/IocTest_tests_SingleCore_SC3" --output-file coverage.info
Capturing coverage data from objs/i386/MinGW/Os_SingleCore_SC3/IocTest_tests_SingleCore_SC3
Found gcov version: 4.8.2
Scanning objs/i386/MinGW/Os_SingleCore_SC3/IocTest_tests_SingleCore_SC3 for .gcda files ...
Found 3 data files in objs/i386/MinGW/Os_SingleCore_SC3/IocTest_tests_SingleCore_SC3
Processing IocTest_tests_SingleCore_SC3/IocTest.gcda
geninfo: WARNING: cannot find an entry for objs#i386#MinGW#Os_SingleCore_SC3#IocTest_tests_SingleCore_SC3#IocTest.c.gcov in .gcno file, skipping file!
geninfo: WARNING: no data found for /cygdrive/e/testRepo/WinPort-Os-cd354a27d1d9/WinPort/Os/Tests/OS_REQ/objs\i386\MinGW\Os_SingleCore_SC3\IocTest_tests_SingleCore_SC3\IocTest.c
Processing IocTest_tests_SingleCore_SC3/OS_REQ.gcda
geninfo: WARNING: cannot find an entry for objs#i386#MinGW#Os_SingleCore_SC3#IocTest_tests_SingleCore_SC3#OS_REQ.c.gcov in .gcno file, skipping file!
geninfo: WARNING: no data found for /cygdrive/e/testRepo/WinPort-Os-cd354a27d1d9/WinPort/Os/Tests/OS_REQ/objs\i386\MinGW\Os_SingleCore_SC3\IocTest_tests_SingleCore_SC3\OS_REQ.c
Processing IocTest_tests_SingleCore_SC3/TestMain.gcda
geninfo: WARNING: cannot find an entry for objs#i386#MinGW#Os_SingleCore_SC3#IocTest_tests_SingleCore_SC3#TestMain.c.gcov in .gcno file, skipping file!
geninfo: WARNING: no data found for /cygdrive/e/testRepo/WinPort-Os-cd354a27d1d9/WinPort/Os/Tests/OS_REQ/objs\i386\MinGW\Os_SingleCore_SC3\IocTest_tests_SingleCore_SC3\TestMain.c
Finished .info-file creation
2 ответа
Во-первых, я бы предложил проверить правильность данных gcov. Значит нужно запустить gcov tool и проверить файл *.gcov на фактический результат. Если он возвращает какое-либо покрытие.
Во-вторых, вы можете использовать, например, --base-directory
$ lcov --base-directory . --directory . -c -o gcov/lcov.info
Обновите CMakeList.txt, чтобы добавить следующие флаги:
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -O0 -fprofile-arcs -ftest-coverage")
set(CMAKE_CXX_OUTPUT_EXTENSION_REPLACE 1)
перейти к созданию каталогаcd {project/lib}
rm -rf * //Remove all items if you want
cmake ..
make
./MyTest
// Запуск тестовых случаев для получения файлов.gcda. Могут быть и другие способы создания файлов gcda, но я предпочитаю этот способ
lcov --capture --directory . --output-file AnyName.info
//AnyName.info будет содержать выводgenhtml AnyName.info --output-directory CODE_COVERAGE
Вы найдете один каталог CODE_COVERAGE в текущем каталоге, перейдите в CODE_COVERAGE и дважды щелкните на index.html, он покажет текущее покрытие кода для тестовых случаев.
cd {project/lib}
rm -rf *
cmake ..
make
./MyTest
lcov --capture --directory . --output-file AnyName.info
genhtml AnyName.info --output-directory CODE_COVERAGE
Я нашел эти шаги для работы: https://codeflu.blog/2014/12/26/using-gcov-and-lcov-to-generate-beautiful-c-code-coverage-statistics/
Вы сначала скомпилировали -g -O0
а также --coverage
флаги? Вы скопировали файлы.gcno из каталога сборки в тот же каталог, где находятся файлы.gcda?
Вы пытались добавить опцию --ignore-errors gcov, source, graph? Это может на самом деле работать с некоторыми файлами, и это будет гарантировать, что lcov продолжит работать после любых проблемных файлов. Если вы обнаружите, что файлы работают, вы можете сделать шаг назад и выяснить, почему указанные выше файлы не работают для lcov. Возможно, им не хватает соответствующих им файлов.gcno.