Почему gcov не сообщает о каких-либо линиях, охватываемых моими модульными тестами?

Я использую Xcode 3.2 на 10.6, с отправленной версией gcov и компилятором GCC по умолчанию (обе версии 4.2.1). Я создал зависимый пакет Cocoa unit test, который был добавлен в мое приложение, и последовали за документацией Apple по настройке конфигурации сборки gcov-instrumented - на основе конфигурации Debug, которая не имеет оптимизаций компилятора.

Когда я создаю тестовый комплект с этой настройкой "Gcov-instrumented", приложение запускается и тесты вводятся и запускаются. Также файлы статистики покрытия создаются по адресу:

build/<AppTarget>.build/Gcov-instrumented/<AppTarget>.build/Objects-normal/x86_64/<object>.gcda

build/<AppTarget>.build/Gcov-instrumented/<AppTarget>.build/Objects-normal/x86_64/<object>.gcno

Пока все хорошо. Я знаю, что тесты действительно выполняются, потому что, если я вставляю отказы, тогда тестовый набор выходит из строя, как ожидалось. К сожалению, gcov сообщает, что никакие строки объектов не были покрыты тестами! Каждая строка отображается как 0. Я искал здесь и в архивах списков рассылки Apple, и не могу найти никого с аналогичной проблемой. Я ожидаю, что у меня что-то не хватает, но что это?

Ответы

Ответ 1

Я сталкивался с этой проблемой с перерывами. Я наткнулся на хорошую удачу, когда он был "главным образом работает" в моем основном проекте. В основном работая, я имею в виду, что я смог получить освещение, чтобы показать, но с немного большей болью, чем 10,5. Например, я должен был агрессивно удалить файлы покрытия и перестроить, чтобы получить какие-либо обновления. Даже в моем "едва работающем" состоянии компилятор/среда выполнения не желает перезаписывать существующий файл данных покрытия.

Я думаю, что снова наткнулся на рабочий сценарий. Voodoo наверняка и менее идеален:

  • Убедитесь, что SDK равен 10.6.
  • Убедитесь, что для развертывания установлено значение gcc 4.0 (!).
  • Сделайте полную очистку проекта.
  • Перестроить.

Получают ли это ваши ожидаемые данные о покрытии?

Конечно, я ожидал бы, что сможет генерировать файлы покрытия, которые работают с использованием gcc 4.2 или одного из компиляторов LLVM, но на данный момент это кажется мне немного менее искалеченным, чем раньше.

Еще одна подсказка: когда я наблюдаю данные покрытия (используя Cover Story), я получаю предупреждения вроде:

/BUILDRESULTS/MarsEdit.build/Code Coverage/MarsEditDataModelTests.build/Objects-normal/i386/MEDataItem.gcno: версия '400A', предпочтительно '402 *'

Но информация о покрытии все еще представлена. Таким образом, кажется, что он отклоняется от старой версии формата покрытия, но если я использую новый компилятор (4.2), который предположительно сгенерирует файлы с более новым форматом .gcno, проблема с охватом 0% меня поразит, как и у Грэма.

Ответ 2

В Xcode 4.6 отчеты по охвату, похоже, работают. Включите "Генерировать файлы контрольных покрытий" и "Поток инструментальных средств" для целевой цели приложения, запустите тесты, а затем укажите инструмент охвата на выходе. Это в ~/Library/Developer/Xcode/Derived Data/<Project>-<hash>/Build/Intermediates/<Target>.build/Debug-iphonesimulator/<Target>.build; открытие этой папки в CoverStory показывает мне результаты, которые я ожидал.

Этот репозиторий GitHub содержит сценарии, которые могут автоматически открывать вывод и получать lcov для его визуализации; Пока я доволен CoverStory.

Ответ 3

Вы можете получить покрытие кода, работающее с gcc 4.2.1. Подробности здесь:

SnowLeopardGCov

Ответ 4

Я пытался получить покрытие кода для симулятора iPhone и всегда получаю покрытие в размере 0%. Ниже приведены сведения о конфигурации и шаги, которые я пробовал.

Конфигурация

Xcode 3.2.5/iOS 4.1 и iOS 4.2/Mac 10.6/GCC 4.2 заявка UICatalog

Ссылки

http://www.cubiclemuses.com/cm/articles/2009/05/14/coverstory-on-the-iphone/

http://developer.apple.com/library/mac/#qa/qa2007/qa1514.html

Шаги

  • Включить "Сгенерировать файлы тестового покрытия"
  • Включить "Прикладной программный поток"
  • Добавить "-lgcov" в "Другие флаги компоновщика"
  • Флаг UIApplicationExitsOnSuspend в Info.plist имеет значение true

Результат

У меня есть файлы .gcda, но покрытие всегда показывает 0%.

Настройки попытались

  • Изменение GCC до 4.0 и 4.2. Когда я пытаюсь изменить GCC на 4.0, я получаю 26 ошибок сборки.
  • Установите переменные среды:

    const char *prefix = "GCOV_PREFIX";
    const char *prefixValue = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] cStringUsingEncoding:NSASCIIStringEncoding]; // This gets the filepath to the app Documents directory
    const char *prefixStrip = "GCOV_PREFIX_STRIP";
    const char *prefixStripValue = "1";
    setenv(prefix, prefixValue, 1); // This sets an environment variable which tells gcov where to put the .gcda files.
    setenv(prefixStrip, prefixStripValue, 1); // This tells gcov to strip the default prefix, and use the filepath that we just declared.)
    
  • Оптимизация GCC установлена ​​на None (-O0) и снят флажок precompiled prefix header file.

Ответ 5

Я получал 0-покрытие, когда *.gcno файлы для статической библиотеки были перезаписаны для разделяемой библиотеки.