Я пытался добиться, чтобы покрытие кода работало для симулятора 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'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.)
Для оптимизации GCC установлено значение Нет (-O0) и снят флажок прекомпилированного файла заголовка префикса.
4 ответа
Спасибо за всю информацию о stackoverfow и CubicleMuses< /а>
У меня есть покрытие кода, работающее как для симулятора, так и для устройства! Вот шаги и конфигурация, которые сработали для меня:
Конфигурация: Xcode 4!
Настройки проекта XCode
Настройки сборки
Другие флаги компоновщика: добавьте «-lgcov»
GCC_GENERATE_TEST_COVERAGE_FILES: установить на ДА
GCC_INSTRUMENT_PROGRAM_FLOW_ARCS: установить на ДА
- Версия компилятора C/C++: GCC 4.2 (если вы используете XCode 4) Цель развертывания iOS: 4.2
- Заголовок префикса прекомпиляции: НЕТ
Info.plist
- Установите флаг UIApplicationExitsOnSuspend в вашем Info.plist на YES
Вышеуказанные шаги одинаковы для симулятора и устройства, однако у нас есть дополнительная работа, чтобы заставить его работать на устройстве.
Main.m: скопируйте и вставьте приведенный ниже код в файл main.m.
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.
Примечание. Убедитесь, что приведенный выше код находится перед:
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 из каталога документов.
Примечание. Мне не удалось получить покрытие кода с помощью Xcode 3.2.5 с теми же настройками. Но Xcode 4 был легкой прогулкой :-)
Спасибо Сангави, так как ваш ответ помог мне.
Теперь но: я следовал вашему описанию шаг за шагом, и у меня возникла проблема, что не были созданы gcda-файлы (только gcdo-файлы).
После этого я удалил ваш (вышеуказанный) префикс-код, который скопировал в main.m и все внезапно заработало. Держу пари, путь gcov был создан неправильно или что-то в этом роде.
Просто опубликуйте это, если кто-то столкнется с той же проблемой.
Я только что понял после нескольких часов разочарования, что включение распределенных сборок в Xcode 3.2.6 обойдет необходимость отключения вашего заголовка префикса.
У меня была проблема, что файлы не были созданы вообще. Это было в Xcode 4.1 на Lion.
Я изменил компилятор с System Default (GCC 4.2)
на GCC 4.2
. Поэтому НЕ используйте систему по умолчанию.
Похоже на ошибку в Xcode, но для меня это решило проблему.
Когда я изменил настройки, проблема вернулась.
Похожие вопросы
Связанные вопросы
Новые вопросы
objective-c
Этот тег следует использовать только для вопросов, касающихся функций Objective-C или зависящих от кода на языке. Теги [cocoa] и [cocoa-touch] следует использовать, чтобы узнать о фреймворках или классах Apple. Используйте связанные теги [ios], [macos], [apple-watch] и [tvos] для проблем, характерных для этих платформ.