Перекрестное профилирование с gcov, но GCOV_PREFIX и GCOV_PREFIX_STRIP игнорируется - PullRequest
8 голосов
/ 06 октября 2011

Я хочу использовать 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 ]

21 голосов
/ 06 октября 2011

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

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

10 голосов
/ 25 февраля 2015

************ ARRRRGGGGHHHHH ************

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

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

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

ФактическиПозвольте мне немного расширить этот ответ.

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

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

Что это означаетis:

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

Итак, представьте, что вынаписание исполняемого файла 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, и, в конце концов, MyApp и MyLib - это просто коллекции файлов .o, заархивированных вместе, с некоторыми другими средствами для исправления указателей функций и прочего.

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

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

Вот где вступают GCOV_PREFIX и GCOV_PREFIX_STRIP.

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

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

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

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

...