Десятки "профилирования: неверный тег дуги" при запуске покрытия кода в Xcode 5
При запуске моей тестовой цели с включенным охватом кода в Xcode 5, я получаю в результате сборки десятки следующего сообщения:
profiling:invalid arc tag (0x...)
Это не влияет на тесты, поскольку они завершаются успешно, а также файлы покрытия GCDA генерируются, как ожидалось.
Любая идея, что означает сообщение, или как подавлять сообщения/исправлять проблему, потому что они загромождают вывод сборки и затрудняют поиск результатов тестового примера.
Ответы
Ответ 1
Скорее всего, это связано с тем, что инструменты сборки не могут слить текущие результаты в существующие .gcda файлы. Как Dave Meehan указывает здесь, существует грубая сила, связанная с этим, очищая папку сборки продукта, но менее жесткий основной подход заключается в удалении .gcda файлы из цепей, генерирующих их (для меня, только для целевой цели) как часть процесса сборки. Dave включает образец script для включения в фазу сборки - или в корне проекта вручную:
find . -name "*.gcda" -print0 | xargs -0 rm
Ответ 2
Для пользователей Xcode 7, возможно, вы задавались вопросом, почему ваш Unit Tests сбой после получения таких сообщений. Решение, которое я нашел, состояло в том, что вам нужно убедиться, что все возможные цели, связанные с потоком сборки (включая все библиотеки), должны иметь эти два параметра сборки: NO:
GCC_GENERATE_TEST_COVERAGE_FILES = NO;
GCC_INSTRUMENT_PROGRAM_FLOW_ARCS = NO;
Если вы ищете раздел "Генерация кода" в настройках сборки, вы найдете их как "Сгенерировать файлы тестового покрытия" и "Поток инструментальных программ".
Подробнее см. https://developer.apple.com/library/ios/qa/qa1514/_index.html
Ответ 3
Старый вопрос, но теперь Xcode 7 GM вышел, и это поведение не изменилось, я сделал более глубокий взгляд. Я считаю, что проблема в том, что охват кода целевой тестовой программы противоречит охвату кода главной целью.
Предполагая, что на самом деле вы не заботитесь о охвате кода вашей целевой темой, эти настройки останавливают ошибки для меня, без необходимости дополнительных скриптов или удаления файлов:
В вашей основной цели (будь то фреймворк или приложение):
Enable Code Coverage Support to YES
Generage Legacy Test Coverage Files to YES
Instrument Program Flow to YES
В моих целях я делал это только для сборки Debug, но ваши потребности могут отличаться.
Затем в вашем целевом наборе тестов:
Enable Code Coverage Support to NO
Generage Legacy Test Coverage Files to NO
Instrument Program Flow to NO
Это разрешило сообщения об ошибках и по-прежнему разрешало создавать файлы покрытия кода соответствующим образом.
Опять же, вопрос старый, но поскольку ошибка все еще выдается в XCode 7, я нашел, что это решение работает лучше, чем удаление файлов со специальными скриптами.
Ответ 4
У меня такая же проблема. В моем appDelegate
под applicationWillTerminate:
у меня есть __gcov_flush();
. Комментируя это, удаляются сообщения invalid arc tag
в моем выпуске сборки.
Я занимаюсь дальнейшим исследованием, чтобы понять, почему это происходит. Я знаю, что если я полностью очищу свой проект и удалю каталог DerivedData
, эти сообщения остановятся на несколько прогонов моих тестов.
EDIT: Я, похоже, исправил это для меня. В моем приложении appDelegate у меня было следующее:
#ifdef DEBUG
+ (void)initialize {
[[NSUserDefaults standardUserDefaults] setValue:@"XCTestLog,GcovTestObserver"
forKey:@"XCTestObserverClass"];
[super initialize];
}
#endif
Я записал GcovTestObserver
неправильно, и после исправления это сообщение остановилось. Удостоверьтесь, что у вас также есть подкласс XCTestObserver
в вашем тестовом целевом окружении stopObserving
со следующим:
- (void) stopObserving
{
[super stopObserving];
UIApplication* application = [UIApplication sharedApplication];
[application.delegate applicationWillTerminate:application];
}
Ответ 5
Возможно, вы захотите очистить все производные папки данных. Особенно, если вы обновляете Xcode или используете более одной версии Xcode.
В свое время я испытал это сразу после того, как обновил Xcode с 6.2 до 6.3 на нашем сервере интеграции, и мы видели эти сообщения в журналах, а также отсутствующие классы в отчете о покрытии, сгенерированном frankencover.it. Удаление папок DerivedData
внутри сервера интеграции исправляет его.
find /Library/Developer/XcodeServer -name DerivedData -print0 | xargs -0 rm -rf
Ответ 6
Я потратил некоторое время, пытаясь понять, как избавиться от этих уродливых и раздражающих сообщений:
профилирование:/Users/appfactory/Desktop/WORK/App/trunk/ObjectiveC.gcda: не может объединить предыдущий файл GCDA: поврежденный тег дуги (0x00000000)
Казалось, что проблема Xcode 7 не была исправлена в текущей версии Xcode 7.1 beta 2.
Проблема возникает из-за невозможности объединить существующие файлы .gcda-покрытия с текущими результатами.
Что я пробовал:
- Удалить эти .gcda файлы с помощью RunScript - не работает в моем случае
echo "Удалить .gcda файлы" echo "$ {OBJECT_FILE_DIR_normal}/${CURRENT_ARCH}"
Внимание: файл ObjectiveC.gcda может находиться в другом месте!
-
Задайте следующие настройки сборки YES - также не помогая
-
Включить поддержку кода для YES
-
Сгенерировать устаревшие тестовые материалы для защиты до YES
-
Поток программы инструмента в YES
-
Решение в моем случае:
Задайте следующие параметры сборки для основной цели
-
Включить поддержку кода для YES
-
Сгенерировать устаревшие тестовые материалы для защиты до YES
-
Поток программы прибора в NO
Задайте следующие параметры сборки для целевой цели (и любых других целей)
-
Включить поддержку покрытия кода NO
-
Сгенерировать устаревшие тестовые файлы покрытия до NO
-
Поток программы прибора в NO
Надеюсь, что это поможет!
Ответ 7
Чтобы устранить проблему получения сообщения "не удалось объединить предыдущие сообщения GCDA файла: поврежденные теги дуги" в консоли, не создавайте файл ObjectiveC.gcda, сделав "Включить модули (C и Objective-C)" на "НЕТ", в целевых настройках.