Gcovr - опция -object-directory не работает должным образом с файлами.gcda в другом каталоге, чем файлы.o

Программа, которую я хочу профилировать с помощью gcovr (или gcov/lcov), находится в общей файловой системе вместе с каталогом сборки, где выполняется компиляция программы, и у меня есть несколько рабочих, с которыми я собираюсь параллельно тестировать свою программу. Чтобы решить проблему состояния гонки (все работники будут запускать мою программу, поэтому все генерирующие файлы gcda с одинаковыми именами в одной и той же папке в общей файловой системе) я перенаправляю файлы gcda в отдельный целевой каталог на каждом работнике (как описано здесь), и я выполняю следующую команду:

gcovr -v -r /absolute/path/to/root --html --html-details -o test-details.html --object-directory=/absolute/path/to/object/dir /absolute/path/to/gcda/dir

где последний путь search_paths, описанный здесь. Я ожидал, что это будет выглядеть в /absolute/path/to/root для источника программы, /absolute/path/to/object/dir для файлов.o и /absolute/path/to/gcda/dir для файлов gcda. Тем не менее, я запустил его с -v и я вижу, что gcovr выполняет команды gcov в форме этого из корневого каталога:

gcov /absolute/path/to/gcda/dir/file.gcda --branch-counts --branch-probabilities --preserve-paths --object-directory /absolute/path/to/gcda/dir

Опять же, я ожидал, что он будет работать в форме этого (посмотрите на путь --object-directory):

gcov /absolute/path/to/gcda/dir/file.gcda --branch-counts --branch-probabilities --preserve-paths --object-directory /absolute/path/to/object/dir

Он работает правильно при запуске как последняя команда, но gcovr выполняет первую. Я использую только gcovr вместо gcov, потому что у меня большой проект (я знаю, что gcovr построен из lcov). Кто-нибудь знает, почему он так себя ведет? (Это так, как он должен работать?) Как я могу сделать так, чтобы он вел себя так, как я хочу? Заранее спасибо!

1 ответ

Решение

Это было отправлено на трекер gcovr на GitHub, вот краткое изложение:

В настоящее время Gcovr ожидает, что файлы.gcda и.gcno находятся рядом друг с другом (что обычно и происходит). Пути поиска влияют на то, где gcovr ищет эти файлы. --Object-directory предоставляет только значение по умолчанию для путей поиска, но здесь вы переопределили это явным путем поиска. Параметр gcovr --object-directory не передается параметру gcov --object-directory.

Начиная с gcovr 4.1, нет возможности решить эту проблему. Вам нужно будет скопировать файлы.gcno из каталога сборки в каждый каталог с данными покрытия. Кроме того, вы можете запустить gcov вручную, а затем объединить файлы.gcov с gcovr -g ...,

Дополнительные примечания:

  • gcov не интересуется объектными файлами.o, только файлами.gcda (записанными во время выполнения теста) и файлами.gcno (записанными во время компиляции).
  • gcovr и lcov не имеют прямого отношения
Другие вопросы по тегам