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 не имеют прямого отношения