Xcode 5でコードカバレッジを有効にしてテストターゲットを実行すると、ビルド出力に次のようなメッセージが多数表示されます。
profiling:invalid arc tag (0x...)
テストは正常に完了するため、テストに影響はないようです。また、GCDAカバレッジファイルも予想どおりに生成されます。
メッセージが何を意味するのか、またはメッセージを抑制して問題を修正する方法は、ビルド出力が乱雑になり、テストケースの結果を見つけるのが困難になるためです。
おそらく、これは、ビルドツールが現在の結果を既存の.gcdaカバレッジファイルにマージできなかった結果です。 Dave Meehanがここで指摘している のように、製品ビルドフォルダーをクリーニングすることでこれに対処する強引な方法がありますが、それほど難しくないコアアプローチは、それらを生成するターゲットから.gcdaファイルを削除することです(ビルドプロセスの一部としてのテストターゲットのみ)。 Daveには、ビルドフェーズとして含まれるサンプルスクリプトが含まれています。または、プロジェクトルートに手動で含まれています。
find . -name "*.gcda" -print0 | xargs -0 rm
Xcode 7を使用しているユーザーにとって、このようなメッセージを受信した後にユニットテストがクラッシュする理由を疑問に思っているかもしれません。私が見つけた解決策は、ビルドフローに関係するすべてのターゲット(すべてのライブラリを含む)で、これらの2つのビルド設定をNOに設定する必要があることを確認する必要があることです。
GCC_GENERATE_TEST_COVERAGE_FILES = NO;
GCC_INSTRUMENT_PROGRAM_FLOW_ARCS = NO;
ビルド設定の「コード生成」セクションを検索すると、「テストカバレッジファイルの生成」および「機器プログラムフロー」としてこれらが見つかります。
詳細については、「 https://developer.Apple.com/library/ios/qa/qa1514/_index.html 」を参照してください
古い質問ですが、現在Xcode 7 GMが出ており、この動作は変更されていません。詳細に調べました。問題は、テストアプリターゲットのコードカバレッジが競合していることです。メインターゲットのコードカバレッジ。
テストターゲットのコードカバレッジを実際に気にしないと仮定すると、これらの設定は、余分なスクリプトやファイルの削除を必要とせずに、エラーを停止します。
メインターゲット(フレームワークまたはアプリ)で設定:
Enable Code Coverage Support to YES
Generage Legacy Test Coverage Files to YES
Instrument Program Flow to YES
私の目的のために、これはデバッグビルドに対してのみ行いましたが、ニーズは異なる場合があります。
次に、テストターゲットセットで:
Enable Code Coverage Support to NO
Generage Legacy Test Coverage Files to NO
Instrument Program Flow to NO
これにより、エラーメッセージが解決され、コードカバレッジファイルを適切に作成できます。
繰り返しますが、質問は古いものですが、XCode 7でエラーが引き続き発行されるため、このソリューションは特別なスクリプトを使用してファイルを削除するよりも優れていることがわかりました。
私は同じ問題を抱えています。 _applicationWillTerminate:
_の下のappDelegate
には、__gcov_flush();
があります。これをコメントアウトすると、ビルド出力から_invalid arc tag
_メッセージが削除されます。
私はこれがなぜ起こるのかを解明するためにさらなる研究を行っています。プロジェクトを完全にクリーンアップしてDerivedData
ディレクトリを削除すると、これらのメッセージはテストを数回実行すると停止することがわかります。
編集:私はこれを修正したようです。 appDelegateには次のものがありました。
_#ifdef DEBUG
+ (void)initialize {
[[NSUserDefaults standardUserDefaults] setValue:@"XCTestLog,GcovTestObserver"
forKey:@"XCTestObserverClass"];
[super initialize];
}
#endif
_
GcovTestObserver
のつづりが間違っていたため、これを修正するとメッセージが停止しました。 TestターゲットにXCTestObserver
のサブクラスがあり、stopObserving
を次のようにオーバーライドしていることも確認してください。
_- (void) stopObserving
{
[super stopObserving];
UIApplication* application = [UIApplication sharedApplication];
[application.delegate applicationWillTerminate:application];
}
_
派生データフォルダーallをクリアすることもできます。特に、Xcodeをアップグレードする場合、または複数のXcodeバージョンを使用する場合。
かつて、統合サーバーでXcodeを6.2から6.3にアップグレードした直後にこれを経験しましたが、ログにこれらのメッセージと、 frankencoverによって生成されたカバレッジレポートにクラスがありませんでした。 。それ 。統合サーバー内のDerivedData
フォルダーを削除すると修正されます。
find /Library/Developer/XcodeServer -name DerivedData -print0 | xargs -0 rm -rf