Как сгенерировать покрытие кода при одновременной работе программы lcov - PullRequest
0 голосов
/ 03 июля 2019

У меня большой проект с исполняемыми файлами unittest, работающими на других машинах.Итак, файлы gcda были сгенерированы на других машинах.Затем я загружаю их на локальную машину, но разные каталоги.Каждый из каталогов имеет исходный код.

Например: dir gcda1/src/{*.gcda, *.gcno, *.h, *.cpp}..., dir gcda2/src/{*.gcda, *.gcno, *.h, *.cpp}....

Поскольку проект очень большой, поэтому мне нужно запустить несколько процессов lcov одновременно, чтобы сгенерировать информационные файлы для сохранениявремя.А затем объедините эти информационные файлы.

Проблема заключается в том, что когда я объединяю эти информационные файлы, потребуется информация dir, например:

gcda1/src/unittest1.cpp
gcda2/src/unittest1.cpp

Я хочу это:

src/unittest1.cpp
#src/unittest1.cpp # this is expected to merge with above

Команды, которые я использую:

$ cd gcda1
$ lcov --rc lcov_branch_coverage=1 -c -d ./ -b ./ --no-external -o gcda1.info
$ cd ../gcda2
$ lcov --rc lcov_branch_coverage=1 -c -d ./ -b ./ --no-external -o gcda2.info
$ cd ..
$ lcov -a gcda1/gcda1.info -a gcda1/gcda2.info -o gcda.info
$ genhtml gcda.info -o output

Корневой каталог содержит исходный код.

1 Ответ

0 голосов
/ 03 июля 2019

Описание

Ну, я наконец нашел способ решить эту проблему.

Сгенерированные информационные файлы lcov представляют собой обычный текстовый файл. Таким образом, мы можем редактировать их напрямую.

Как только вы откроете эти файлы, вы увидите, что каждая строка файла начинается с SF. Как ниже:

SF:/path/to/your/source/code.h
SF:/path/to/your/source/code.cpp
...

Задача

В моей задаче это будет:

// file gcda1.info
SF:/path/to/root_dir/gcda1/src/unittest1.cpp
// file gcda2.info
SF:/path/to/root_dir/gcda2/src/unittest1.cpp

А после lcov слияния это будет:

// file gcda.info
SF:/path/to/root_dir/gcda1/src/unittest1.cpp
SF:/path/to/root_dir/gcda2/src/unittest1.cpp

Но, я ожидаю этого:

// file gcda.info
SF:/path/to/root_dir/src/unittest1.cpp

Метод

Мой метод решения проблемы - редактирование информационных файлов напрямую.

Сначала отредактируйте gcda1.info и gcda2.info, измените /path/to/root_dir/gcda1/src/unittest1.cpp на /path/to/root_dir/src/unittest1.cpp и /path/to/root_dir/gcda2/src/unittest1.cpp на /path/to/root_dir/src/unittest1.cpp.

Затем объедините их, как показано ниже, и сгенерируйте отчет html:

$ lcov -a gcda1.info -a gcda2.info -o gcda.info
$ genhtml gcda.info -o output

В большом проекте мы не можем вручную редактировать каждый информационный файл, иначе вы свернетесь.

Мы можем использовать sed, чтобы помочь нам. Как ниже:

$ sed "s/\(^SF.*\/\)gcda[0-9]+\/\(.*\)/\1\2/g" gcda_tmp.info > gcda.info
...