Покрытие кода, не показывающее результаты с помощью Xcode + gcov

Я пытался получить покрытие кода для симулятора 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) и не отмечена флаг префиксного файла заголовка префикса.

Ответы

Ответ 1

Спасибо за всю информацию о stackoverfow и CubicleMuses

У меня есть покрытие кода, работающее как для симулятора, так и для устройства! Вот шаги и настройки, которые работали для меня:

Конфигурация: Xcode 4!

Настройки проекта XCode

Настройки сборки

  • Другие флаги компоновщика: добавьте "-lgcov"

  • GCC_GENERATE_TEST_COVERAGE_FILES: Установить к YES

  • GCC_INSTRUMENT_PROGRAM_FLOW_ARCS: Установить к YES

  • Версия компилятора C/С++: GCC 4.2 (если вы на XCode 4) Цель развертывания iOS: 4.2
  • Заголовок префиксного префикса: NO

Info.plist

  • Установить флаг UIApplicationExitsOnSuspend в вашем Info.plist к YES

Выше шаги одинаковы для Simulator и Device, однако у нас есть дополнительная работа, чтобы заставить его работать на устройстве.

Main.m: скопируйте код ниже в main.m

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.

Примечание. Перед тем, как сделать код выше:

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
int retVal = UIApplicationMain(argc, argv, nil, nil);
[pool release];    
return retVal;

Почему мы устанавливаем указанные выше переменные покрытия?

http://gcc.gnu.org/onlinedocs/gcc/Cross_002dprofiling.html

Как получить файлы .gcda?

Используйте организатор в Xcode для загрузки пакета приложения с устройства, чтобы получить файлы .gcda из каталога Documents.

Примечание. Я не мог получить покрытие кода с помощью Xcode 3.2.5 с теми же настройками. Но Xcode 4 - это торт: -)

Ответ 2

Спасибо Сангави, так как ваш ответ помог мне.

Теперь, но: Я шаг за шагом следил за вашим описанием, и у меня была проблема с тем, что не были созданы файлы gcda (только gcdo файлы).

После этого я удалил префикс-код (выше), который я скопировал в main.m, и все работало внезапно. Ставка gcov-path не была создана правильно или что-то в этом роде.

Просто опубликуйте это, если кто-нибудь столкнется с той же проблемой.

Ответ 3

Я только что понял, что разочарование в том, что включение распределенных сборок в Xcode 3.2.6 обойдется вам в необходимости отключить заголовок префикса.

Ответ 4

У меня возникла проблема, что файлы вообще не создавались. Это было в Xcode 4.1 на Lion.

Я сменил компилятор с System Default (GCC 4.2) на GCC 4.2. Поэтому НЕ используйте систему по умолчанию.

Похоже на ошибку в Xcode, но она решила проблему для меня.
Когда я изменил предпочтение, проблема вернулась.