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

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

Когда я создаю тестовый пакет с этой конфигурацией, «оснащенной Gcov», приложение запускается, и тесты вводятся и запускаются. Также файлы статистики покрытия создаются по адресу:

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 и не нашел никого с похожей проблемой. Я полагаю, что что-то упускаю - но что это?


person Community    schedule 06.09.2009    source источник


Ответы (5)


Я периодически сталкиваюсь с этой проблемой. Я наткнулся на хороший отрезок удачного времени, когда он «в основном работал» в моем основном проекте. Под «в основном работой» я имею в виду, что я смог получить покрытие, чтобы появиться, но с немного большей болью, чем на 10.5. Мне пришлось агрессивно удалить файлы покрытия и перестроить, например, чтобы получить какие-либо обновления. Даже в моем «почти рабочем» состоянии компилятор / среда выполнения, похоже, не желают перезаписывать существующий файл данных покрытия.

Думаю, я вернулся к рабочему сценарию. Вуду точно, но далеко не идеально:

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

Дает ли это ожидаемые данные о покрытии?

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

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

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

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

person danielpunkass    schedule 12.10.2009
comment
Спасибо за это! Теперь я получаю то освещение, которое я ожидал :-) - person ; 13.10.2009
comment
+1 У меня получилось, что он работает с таким же подходом на Snow Leopard. Требование перейти на GCC 4.0 несколько сбивает с толку в будущем, поскольку код, который должен быть скомпилирован с GCC 4.2 или LLVM (например, если он использует блоки), не будет работать в старой версии компилятора, и покрытие кода может исчезнуть. Похоже, что радар ожидает отправки ... - person Quinn Taylor; 24.02.2010
comment
Дэниел, я сталкиваюсь с аналогичными проблемами при использовании lcov для создания отчетов о покрытии HTML. Это позволяет мне передать --gcov-tool /usr/bin/gcov-4.0, чтобы переопределить значение по умолчанию 4.2, на которое указывает /usr/bin/gcov. Я заглянул в источник CoverStory, и он использует эту символическую ссылку. code.google.com/p/coverstory/source/ browse / trunk / Конечно, было бы неплохо, если бы они действительно добавили для этого пользователя по умолчанию, даже если его нет в диалоговом окне настроек ... - person Quinn Taylor; 26.02.2010
comment
Куинн, где вы вводите --gcov-tool /usr/bin/gcov-4.0 флаги? Я пробовал это в настройке флагов компоновщика, но когда я компилирую, Xcode выдает мне ошибку. Когда я пытаюсь выполнить компиляцию gcc из командной строки с этим флагом, он также выдает ошибку: ld: warning: in /usr/bin/gcov-4.0, missing required architecture x86_64 in file - person John Gallagher; 04.04.2010
comment
@danielpunkass Или я делал, пока не начал использовать блоки и не смог использовать GCC 4.0 :( - person ; 13.06.2010
comment
@quinntaylor Последняя версия Coverstory должна определять флаги версии gcc за вас. - person dmaclach; 04.01.2011

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

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

person Community    schedule 29.01.2013
comment
Мой путь к файлам .gcda и .gcdo немного отличался: ~ / Library / Developer / Xcode / Derived Data / ‹Project› - ‹hash› / Build / Intermediates / ‹Target› .build / Debug-iphonesimulator / ‹Target› .build / Объекты-нормальный / i386 - person Marco; 01.02.2013

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

SnowLeopardGCov

person dmaclach    schedule 01.06.2010
comment
Содержимое этой страницы было заменено (по состоянию на 4 июня) сообщением «Эта страница устарела. Эта информация собрана в Google Toolbox для Mac Wiki ». и ссылку на code.google.com/p/google- toolbox-for-mac / wiki / SnowLeopardGCov. - person Peter Hosey; 07.06.2010
comment
Исправлено с помощью новой улучшенной ссылки. Спасибо, Питер. - person dmaclach; 07.06.2010
comment
это не сработало для меня. Я установил компилятор на 4.2, удалил заголовки префиксов и выполнил полностью чистую сборку целевого объекта модульного теста. Я вообще не получаю никакой информации о покрытии. - person ; 13.06.2010
comment
Привет, Грэм. Я предполагаю, что вы также включили для цели флаги Instrument Program Flow и Generate Test Coverage Files? - person dmaclach; 15.06.2010
comment
Грэм, пожалуйста, убедитесь, что вы правильно завершаете работу с iOS 4.0. подробнее здесь: code.google.com/p/google- toolbox-for-mac / wiki / iOSGCov - person dmaclach; 04.01.2011

Я пытался добиться, чтобы покрытие кода работало для симулятора 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%.

Настройки пробовали

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

    const char *prefix = "GCOV_PREFIX";
    const char *prefixValue = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] cStringUsingEncoding:NSASCIIStringEncoding]; // This gets the filepath to the app's 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.)
    
  3. Для оптимизации GCC установлено значение Нет (-O0) и снят флажок файла заголовка прекомпилированного префикса.
person Sangavi    schedule 24.02.2011

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

person Vanuan    schedule 21.09.2011