Перекрестное профилирование с gcov, но GCOV_PREFIX и GCOV_PREFIX_STRIP игнорируется

Я хочу использовать GCOV для покрытия кода, но тесты будут выполняться на другой машине. Таким образом, жесткий проводной путь к файлам.gcda в исполняемом файле не будет работать.

Чтобы изменить этот каталог по умолчанию, я могу использовать env-переменные GCOV_PREFIX и GCOV_PREFIX_STRIP, как сказано здесь.

Вот мои команды, которые я использовал:

$ export GCOV_PREFIX="/foo/bar"
$ export GCOV_PREFIX_STRIP="3"
$ gcc main.c -fprofile-arcs -ftest-coverage
$ strings a.out | grep gcda
/home/calmarius/blahblah/main.c.gcda

Путь остается прежним. Кто-нибудь имеет опыт работы с этим?

2 ответа

Решение

Переменные среды учитываются при запуске кода.

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

************ ARRRRGGGGGHHHHH ************

Пожалуйста, пожалуйста, проголосуйте за ответ Мэта.

Переменные среды учитываются при запуске кода.

Это одно предложение, очевидно, отсутствует в КАЖДОММ документе, который я прочитал о том, как переместить вывод!

На самом деле, позвольте мне немного расширить этот ответ.

GCOV_PREFIX - это переменная окружения времени выполнения, в отличие от времени создания, которая определяет корневой каталог, в который записываются выходные файлы gcov (*.gcda).

GCOV_PREFIX_STRIP = X также является переменной времени выполнения и позволяет удалять элементы X из пути, найденного в объектных файлах (строки XXXX.o)

Что это значит:

Когда вы строите свой проект, объектные файлы записываются с полным путем к местоположению каждого исходного файла, отвечающего за каждый вложенный в них объектный файл.

Итак, представьте, что вы пишете исполняемый файл MyApp и библиотеку MyLib в строгой структуре каталога следующим образом:

/MyProject 
 |-MyApp 
 |--MyLib

Обратите внимание, MyLib является подкаталогом MyApp

Допустим, MyApp имеет 2 исходных файла, а MyLib - 3

После сборки с флагом "-coverage" вы сгенерируете 5 файлов.gcno, по 1 для каждого объектного файла.

В файлах.o для MyApp будет указан абсолютный путь **/MyProject/MyApp/**a_source_file.cpp Аналогично, в файлах.o для MyLib будет указан путь **/MyProject/MyApp/MyLib/**another_source_file.cpp

Теперь предположим, что вы похожи на меня, и переместите эти файлы на совершенно другую машину с другой структурой каталогов, из которой они были созданы. В моем случае целевая машина на самом деле совершенно другой архитектуры. Я разверну в /some/deploy/path not /MyProject на этой машине.

Если вы просто запустите приложение, gcov data попытается записать соответствующие файлы.gcda в / MyProject / MyApp и / MyProject / MyApp / MyLib для каждого объектного файла в вашем проекте, потому что это путь, указанный в файлах.o, и после all, MyApp и MyLib - это просто коллекции файлов.o, заархивированных вместе, с некоторыми другими средствами для исправления функциональных указателей и прочего.

Скорее всего, эти каталоги не существуют, и вы, вероятно, не являетесь пользователем root (не так ли), поэтому эти каталоги также не будут созданы. Ооооо... вы не увидите никаких файлов gcda в месте развертывания / my / deploy / path.

Это совершенно сбивает с толку, верно!?!??!?!?!?

Здесь вступают GCOV_PREFIX и GCOV_PREFIX_STRIP.

(БАМ! Кулак бьёт по лбу) Вам нужно указать **** время выполнения ****, что встроенный путь в.o-файлах не совсем то, что вам нужно. Вы хотите "удалить" часть пути и заменить его каталогом deploy.

Таким образом, вы устанавливаете каталог deploy с помощью GCOV_PREFIX=/some/deploy/path и хотите удалить / MyProject из сгенерированных путей.gcda, чтобы установить GCOV_PREFIX_STRIP=1

С этими двумя установленными переменными среды вы запускаете свое приложение и затем смотрите в /some/deploy/path/MyApp и /some/deploy/path/MyApp/MyLib и вот, чудеса появляются 5 gcda-файлов, по одному для каждого объекта файл.

Примечание: проблема усложняется, если вы делаете из исходных сборок..O указывает на источник, но gcda будет записан относительно каталога сборки.

Другие вопросы по тегам