5

Apple LLVM Compiler 4.1 を使用して、Xcode 4.5 で実行されている iOS プロジェクトでコード カバレッジ データ ファイル (.gdca および .gcno) を生成しています。

Library/Developer/Xcode/DerivedData/viewer-evgaabclrjcouydwveuptwroeofm/Build/Intermediates/viewer.build/Coverage-iphonesimulator/viewer_generic/viewer_generic.build/Objects-normal/i386 の下にファイルが生成されています。

すべての (.o、.d、.dia、.gcda、.gdno) ファイルはこのディレクトリの下にあります。サブフォルダーはありません。

Cover Story を使用して個々の .gcda ファイルを開くことができます。ここで、cobertura を使用して表示できるレポートを生成したいと考えています。

これにはgcovrを使用しようとしています。端末で上記のフォルダーにたどり着きました

Command: gcovr -r `pwd` -x -v

Output:
(Several lines of similar output as below)
Running gcov: 'gcov /Users/abc/Library/Developer/Xcode/DerivedData/viewer-evgaabclrjcouydwveuptwroeofm/Build/Intermediates/viewer.build/Coverage-iphonesimulator/viewer_generic/viewer_generic.build/Objects-normal/i386/FILE_NAME.gcda --branch-counts --branch-probabilities --preserve-paths --object-directory /Users/abc/Library/Developer/Xcode/DerivedData/viewer-evgaabclrjcouydwveuptwroeofm/Build/Intermediates/viewer.build/Coverage-iphonesimulator/viewer_generic/viewer_generic.build/Objects-normal/i386' in '/Users/abc/Library/Developer/Xcode/DerivedData/viewer-evgaabclrjcouydwveuptwroeofm/Build/Intermediates/viewer.build/Coverage-iphonesimulator/viewer_generic/viewer_generic.build/Objects-normal/i386'
    Parsing coverage data for file /Users/abc/Documents/Perforce/DPS-MacBookPro/depot/sandbox/Viewer-Labatt/Blue/viewers/ipadviewer/iphone/apps/viewer/Classes/view/zooming/FILE_NAME.mm
    Filtering coverage data for file /Users/abc/Documents/Perforce/DPS-MacBookPro/depot/sandbox/Viewer-Labatt/Blue/viewers/ipadviewer/iphone/apps/viewer/Classes/view/zooming/FILE_NAME.mm
    Gathered coveraged data for 0 files
    <?xml version="1.0" ?>
    <!DOCTYPE coverage
      SYSTEM 'http://cobertura.sourceforge.net/xml/coverage-03.dtd'>
    <coverage branch-rate="0.0" line-rate="0.0" timestamp="1354144430" version="gcovr 2.4 (r2774)">
        <sources>
            <source>
                /Users/abc/Library/Developer/Xcode/DerivedData/viewer-evgaabclrjcouydwveuptwroeofm/Build/Intermediates/viewer.build/Coverage-iphonesimulator/viewer_generic/viewer_generic.build/Objects-normal/i386
            </source>
        </sources>
        <packages/>
    </coverage>

警告が表示されます: gcno:version '404', prefer '402'

gcovr がレポートを作成できない理由を突き止めてください。

4

2 に答える 2

6

Tl;dr: LLVM が出力するコード カバレッジ ファイルは、gcovr が期待するものよりも新しいものです。gcovr のバージョンをリンクされたバージョン (バージョン 2.4) に置き換えると、動作するはずです。多分。

LLVM の前に、Xcode はコンパイラとして GCC を使用していました。GCC には、.gcno、.gcda、およびそれらの同類のすべてのファイルを生成する「gcov」と呼ばれるツールが含まれていました。

当時、Mac には GCC バージョン 4.2 がプリインストールされていました (そして今でもインストールされています)。したがって、Xcode はプロジェクトを gcc 4.2 でコンパイルし、gcov バージョン 4.2 を実行します。これにより、4.2 バージョンのテスト カバレッジ ファイルが生成されます。2.0 より前のアルファ版は gcov 4.2 を念頭に置いて書かれているように見えるため、これは gcovr では問題なく機能しました。

しかし、Apple が LLVM に切り替えたとき、事態はおかしな方向に進みました。ターゲット設定で「テスト カバレッジ ファイルの生成」フラグを設定すると、LLVM は gcov スタイルのテスト カバレッジ ファイルも出力します。しかし、LLVM はデフォルトで gcov 4.4 ファイルを出力します。4.2 ではありません。

この人物は、LLVM に 4.2 バージョンのファイルを出力するように指示できれば (技術的には可能であると思います)、問題が解決するだろうという考えを持っていました。それはおそらく本当ですが、それを行う方法がわかりません。

しかし、私は自分で解決策を見つけました。ターミナルを開き、gcovr のバージョンを確認しました。

gcovr --version

私の gcovr のバージョンは、実際には gcovr 2.0-prerelease であることがわかりました。このバージョンは、テスト カバレッジ ファイルの gcov 4.4 バージョンをサポートしていません。

それで、そうするバージョンを見つけました。

これがホストされているページは次のとおりです: https://software.sandia.gov/trac/fast/wiki/gcovr

スクリプト自体へのリンクは次のとおりです: https://software.sandia.gov/trac/fast/export/2800/gcovr/trunk/scripts/gcovr

このスクリプトは、gcc 4.8 までをサポートする gcovr 2.4 です。理論的には、LLVM が出力するテスト カバレッジ ファイルの 4.4 バージョンに非常に満足しているはずです。その警告は完全になくなりました。それを試してみてください、それがどうなるか教えてください!

于 2012-12-11T17:58:30.333 に答える
1

オブジェクト ディレクトリ パスを正しく指定していますか? gcovrのドキュメントによると

--object-directory=OBJDIR: gcov データ ファイルを含むディレクトリを指定します。gcovr は、*.gcda ファイルと gcc が最初に実行されたディレクトリとの間のパスを識別できる必要があります。通常、gcovr は正しく推測できます。このオプションは、gcovr の通常のパス検出をオーバーライドし、gcc から gcda ファイルへのパス (つまり、gcc の '-o' オプションに渡されたもの)、または gcda ファイルから gcc の元の作業ディレクトリへのパスを指定できます。

次のコマンドは、プロジェクトのルート ディレクトリで実行すると機能します。

gcovr -r . --object-directory path_to_coverage_files -x > coverage.xml

path_to_coverage_files は、すべての (.o、.d、.dia、.gcda、.gdno) ファイルがあるディレクトリです。

于 2013-07-09T15:37:05.183 に答える