web-dev-qa-db-ja.com

Xcode 5でコードカバレッジを実行する際の「profiling:invalid arc tag」の多数

Xcode 5でコードカバレッジを有効にしてテストターゲットを実行すると、ビルド出力に次のようなメッセージが多数表示されます。

profiling:invalid arc tag (0x...)

テストは正常に完了するため、テストに影響はないようです。また、GCDAカバレッジファイルも予想どおりに生成されます。

メッセージが何を意味するのか、またはメッセージを抑制して問題を修正する方法は、ビルド出力が乱雑になり、テストケースの結果を見つけるのが困難になるためです。

47
jasonjwwilliams

おそらく、これは、ビルドツールが現在の結果を既存の.gcdaカバレッジファイルにマージできなかった結果です。 Dave Meehanがここで指摘している のように、製品ビルドフォルダーをクリーニングすることでこれに対処する強引な方法がありますが、それほど難しくないコアアプローチは、それらを生成するターゲットから.gcdaファイルを削除することです(ビルドプロセスの一部としてのテストターゲットのみ)。 Daveには、ビルドフェーズとして含まれるサンプルスクリプトが含まれています。または、プロジェクトルートに手動で含まれています。

find . -name "*.gcda" -print0 | xargs -0 rm
49
jstevenco

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 」を参照してください

31
skensell

古い質問ですが、現在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でエラーが引き続き発行されるため、このソリューションは特別なスクリプトを使用してファイルを削除するよりも優れていることがわかりました。

4
A.J

私は同じ問題を抱えています。 _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];
}
_
2
xthule

派生データフォルダーallをクリアすることもできます。特に、Xcodeをアップグレードする場合、または複数のXcodeバージョンを使用する場合。

かつて、統合サーバーでXcodeを6.2から6.3にアップグレードした直後にこれを経験しましたが、ログにこれらのメッセージと、 frankencoverによって生成されたカバレッジレポートにクラスがありませんでした。 。それ 。統合サーバー内のDerivedDataフォルダーを削除すると修正されます。

find /Library/Developer/XcodeServer -name DerivedData -print0 | xargs -0 rm -rf
0
adib