Десятки "профилирования: неверный тег дуги" при запуске покрытия кода в 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 может находиться в другом месте!

  1. Задайте следующие настройки сборки YES - также не помогая

    • Включить поддержку кода для YES

    • Сгенерировать устаревшие тестовые материалы для защиты до YES

    • Поток программы инструмента в YES

  2. Решение в моем случае:

Задайте следующие параметры сборки для основной цели

  • Включить поддержку кода для YES

  • Сгенерировать устаревшие тестовые материалы для защиты до YES

  • Поток программы прибора в NO

Задайте следующие параметры сборки для целевой цели (и любых других целей)

  • Включить поддержку покрытия кода NO

  • Сгенерировать устаревшие тестовые файлы покрытия до NO

  • Поток программы прибора в NO

Надеюсь, что это поможет!

Ответ 7

Чтобы устранить проблему получения сообщения "не удалось объединить предыдущие сообщения GCDA файла: поврежденные теги дуги" в консоли, не создавайте файл ObjectiveC.gcda, сделав "Включить модули (C и Objective-C)" на "НЕТ", в целевых настройках.