15

出荷されたバージョンの gcov とデフォルトの GCC コンパイラ (両方ともバージョン 4.2.1) を使用して、10.6 で Xcode 3.2 を使用しています。アプリに挿入される依存 Cocoa 単体テスト バンドルを作成し、コンパイラの最適化が有効になっていないデバッグ構成に基づいて、gcov でインストルメント化されたビルド構成のセットアップに関する Apple のドキュメントに従いました。

この「Gcov-instrumented」構成でテスト バンドルをビルドすると、アプリが起動し、テストが挿入されて実行されます。また、カバレッジ統計ファイルは次の場所に生成されます。

build/<AppTarget>.build/Gcov-instrumented/<AppTarget>.build/Objects-normal/x86_64/<object>.gcda

build/<AppTarget>.build/Gcov-instrumented/<AppTarget>.build/Objects-normal/x86_64/<object>.gcno

ここまでは順調ですね。エラーを挿入すると、テスト スイートが期待どおりに失敗するため、テストが実際に実行されていることがわかります。残念ながら、gcov は、オブジェクトのどの行もテストでカバーされていないと報告しています! すべての行が 0 カバレッジとして報告されます。ここと Apple メーリング リストのアーカイブを検索しましたが、同じような問題を抱えている人は見つかりませんでした。何かが足りないと思いますが、それは何ですか?

4

5 に答える 5

10

私は断続的にこの問題に遭遇しています。私は、メインプロジェクトで「ほとんど機能している」幸運な時間に出くわしました。ほとんどの場合、私はカバレッジを表示することができましたが、10.5 よりも少し痛みがありました。たとえば、更新を取得するために、カバレッジ ファイルを積極的に削除して再構築する必要がありました。私の「ほとんど動作していない」状態でも、コンパイラ/ランタイムは既存のカバレッジ データ ファイルを上書きしようとはしていないようです。

作業シナリオに戻ったと思います。確かにブードゥー教であり、理想的とは言えません:

  1. SDK が 10.6 であることを確認します。
  2. デプロイメントが gcc 4.0 (!) に設定されていることを確認してください。
  3. プロジェクトを完全にクリーンアップします。
  4. 再構築します。

これで期待されるカバレッジ データが得られますか?

確かに、gcc 4.2 または LLVM コンパイラの 1 つを使用して機能するカバレッジ ファイルを生成できると期待していますが、今のところ、これにより以前よりも少し不自由になったようです。

別の手がかり: (Google のCover Storyを使用して) カバレッジ データを観察すると、次のような警告が表示されます。

/BUILDRESULTS/MarsEdit.build/Code Coverage/MarsEditDataModelTests.build/Objects-normal/i386/MEDataItem.gcno:バージョン '400A'、優先 '402*'

ただし、カバレッジ情報は引き続き表示されます。そのため、古いカバレッジ形式のバージョンにはうんざりしているようですが、おそらく新しい形式の.gcnoファイルを生成する新しいコンパイラ (4.2) を使用すると、Graham と同じように 0% のカバレッジの問題に悩まされます。

于 2009-10-12T17:10:19.823 に答える
7

Xcode 4.6 では、カバレッジ レポートが機能しているように見えます。アプリ ターゲットの [Generate Test Coverage Files] と [Instrument Program Flow] をオンにし、テストを実行してから、カバレッジ ツールを出力に向けます。その中に~/Library/Developer/Xcode/Derived Data/<Project>-<hash>/Build/Intermediates/<Target>.build/Debug-iphonesimulator/<Target>.buildあります。そのフォルダを CoverStory で開くと、期待どおりの結果が表示されます。

この GitHub リポジトリには、出力を自動的に検出し、lcov を取得して視覚化できるスクリプトが含まれています。今のところ、CoverStory に満足しています。

于 2013-01-29T13:57:14.327 に答える
2

gcc 4.2.1 で動作するコード カバレッジを取得できます。詳細はこちら:

SnowLeopardGCov

于 2010-06-01T22:25:15.703 に答える
0

私は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

手順

  • 「テスト カバレッジ ファイルの生成」を有効にする</li>
  • 「インストゥルメント プログラム フロー」を有効にする</li>
  • 「その他のリンカー フラグ」に「-lgcov」を追加</li>
  • Info.plist の UIApplicationExitsOnSuspend フラグが true に設定されている

結果

.gcda ファイルを生成しましたが、カバレッジは常に 0% と表示されます。

試した設定

  1. GCC を 4.0 および 4.2 に変更します。GCC を 4.0 に変更しようとすると、26 のビルド エラーが発生します。
  2. 環境変数を設定します。

    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.)
    
  3. GCC 最適化を [なし] (-O0) に設定し、プリコンパイル済みプレフィックス ヘッダー ファイル フラグのチェックを外しました。
于 2011-02-24T06:03:28.220 に答える
0

静的ライブラリの *.gcno ファイルが共有ライブラリのファイルによって上書きされると、カバレッジが 0 になりました。

于 2011-09-21T20:58:21.093 に答える