Покрытие кода, не показывающее результаты с помощью 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, но она решила проблему для меня.
Когда я изменил предпочтение, проблема вернулась.