Lors de l'exécution de ma cible de test avec une couverture de code activée dans Xcode 5, j'obtiens des dizaines de messages suivants dans la sortie de la génération:
profiling:invalid arc tag (0x...)
Cela ne semble pas affecter les tests, car ils se terminent avec succès, et les fichiers de couverture GCDA sont également générés comme prévu.
Toute idée de ce que signifie le message, ou comment supprimer les messages/résoudre le problème, car ils encombrent la sortie de la construction et rendent difficile la recherche des résultats du scénario de test.
Cela est probablement dû au fait que les outils de génération n'ont pas fusionné les résultats actuels dans les fichiers de couverture .gcda existants. Comme Dave Meehan le souligne ici , il existe un moyen brutal de gérer cela en nettoyant le dossier de construction du produit, mais une approche moins dure consiste à supprimer les fichiers .gcda des cibles qui les génèrent (pour moi, juste la cible de test) dans le cadre du processus de construction. Dave inclut un exemple de script à inclure comme phase de construction - ou, à la racine du projet à la main:
find . -name "*.gcda" -print0 | xargs -0 rm
Pour les utilisateurs de Xcode 7, vous vous demandez peut-être pourquoi vos tests unitaires se bloquent après avoir reçu des messages comme celui-ci. La solution que j'ai trouvée était que vous devez vous assurer que toutes les cibles possibles impliquées dans votre flux de build (y compris toutes les bibliothèques) devraient avoir ces deux paramètres de build définis sur NO:
GCC_GENERATE_TEST_COVERAGE_FILES = NO;
GCC_INSTRUMENT_PROGRAM_FLOW_ARCS = NO;
Si vous recherchez la section "Génération de code" dans les paramètres de construction, vous les trouverez comme "Générer des fichiers de couverture de test" et "Flux de programme d'instrument".
Pour plus d'informations, voir https://developer.Apple.com/library/ios/qa/qa1514/_index.html
Ancienne question, mais maintenant Xcode 7 GM est sorti, et ce comportement n'a pas changé, j'ai jeté un coup d'œil plus profond. Le problème, je crois, est que la couverture du code de la cible de l'application de test est en conflit avec une couverture de code de la cible principale.
En supposant que vous ne vous souciez pas réellement de la couverture de code de votre cible de test, ces paramètres arrêtent les erreurs pour moi, sans avoir besoin de scripts supplémentaires ou de supprimer des fichiers:
Dans votre cible principale (que ce soit un framework ou une application), définissez:
Enable Code Coverage Support to YES
Generage Legacy Test Coverage Files to YES
Instrument Program Flow to YES
Pour mes besoins, je ne l'ai fait que pour les versions de débogage, mais vos besoins peuvent varier.
Ensuite, dans votre ensemble cible de tests:
Enable Code Coverage Support to NO
Generage Legacy Test Coverage Files to NO
Instrument Program Flow to NO
Cela a résolu les messages d'erreur tout en permettant aux fichiers de couverture de code d'être créés de manière appropriée.
Encore une fois, la question est ancienne, mais comme l'erreur est toujours publiée dans XCode 7, j'ai trouvé que cette solution fonctionnait mieux que la suppression de fichiers avec des scripts spéciaux.
J'ai le même problème. Dans mon appDelegate
sous applicationWillTerminate:
J'ai la __gcov_flush();
. Commenter cela supprime les messages invalid arc tag
Dans ma sortie de build.
Je fais d'autres recherches pour comprendre pourquoi cela se produit. Je sais que si je nettoie complètement mon projet et que je supprime le répertoire DerivedData
, ces messages s'arrêteront pendant quelques exécutions de mes tests.
EDIT: J'ai semblé avoir corrigé cela pour moi. Dans mon appDelegate, j'avais les éléments suivants:
#ifdef DEBUG
+ (void)initialize {
[[NSUserDefaults standardUserDefaults] setValue:@"XCTestLog,GcovTestObserver"
forKey:@"XCTestObserverClass"];
[super initialize];
}
#endif
J'ai mal orthographié GcovTestObserver
, et après avoir corrigé cela, les messages se sont arrêtés. Assurez-vous que vous disposez également d'une sous-classe de XCTestObserver
dans votre cible de test remplaçant stopObserving
avec les éléments suivants:
- (void) stopObserving
{
[super stopObserving];
UIApplication* application = [UIApplication sharedApplication];
[application.delegate applicationWillTerminate:application];
}
Vous voudrez peut-être effacer tous les dossiers de données dérivés . Surtout si vous mettez à niveau Xcode ou utilisez plusieurs versions de Xcode.
À un moment donné, j'ai vécu cela juste après avoir mis à niveau Xcode de 6.2 à 6.3 dans notre serveur d'intégration et nous avons vu ces messages dans les journaux ainsi que les classes manquantes dans le rapport de couverture généré par frankencover.it . La suppression des dossiers DerivedData
dans le serveur d'intégration le corrige.
find /Library/Developer/XcodeServer -name DerivedData -print0 | xargs -0 rm -rf