6

プロジェクトで gcov を正常に使用しています。

  • gcov フラグを使用してプロジェクトをビルドできます。-fprofile-arcs -ftest-coverage
  • -lgcovオプションと連動
  • 単体テスト プログラムを実行すると、多数のgcdaandgcnoファイルが生成されます。
  • gcov を何度も実行すると、大量のgcovファイルが生成されます。
  • 結果を要約し、次のような行のリストを作成します。
    • #####: 42: virtual double run_time() const { return 0; }

私はそれから「ドッ!」に行きます。不足しているメソッドを呼び出すテストを作成します。

上記の例の行は非常に簡単に診断できます.gcovは、私が呼び出していない正確なメソッドを教えてくれました.

gcov によってフラグが付けられたコピー コンストラクターの例もありましたが、Visual Studio デバッガーを使用してステップ実行できます。そこでの解決策は、gcov がコピーを省略した RVO に苦しんでいることを認識することでしたが、コピーを強制するテストを作成することでそれが修正されました。

私が理解できない他の例がいくつかあります。

1.
File.cpp
#####: 78:}

gcov は、ファイルの最後の行である名前空間の右中括弧にフラグを立てているようです。

2.
File.h
#####: 33:  class FooBase: public IResult {

ここでgcovが私に伝えようとしているのは何ですか? ここにかける電話が思い浮かびません。
更新 1:デフォルトのコンストラクターがあることを検出しました。これFooBaseは、サブクラスによってのみ「呼び出される」場合、インスタンス化して呼び出すことと同じではありませんgcov

Update 2: I've been using djgpp/gcc 4.4.4 which produced the above results. However, by using MinGW/gcc 4.5.2 the 'aberrations' disappear and with a little more work I've been able to get to 100% line coverage.

Please write your answers with either a single tip for the unwary gcov user, or an answer to one of my examples.

4

3 に答える 3

2

gcov.c で言われているように

  /* For lines which don't exist in the .bb file, print '-' before
     the source line.  For lines which exist but were never
     executed, print '#####' before the source line.  Otherwise,
     print the execution count before the source line.  There are
     16 spaces of indentation added before the source line so that
     tabs won't be messed up.  */

カバレッジを取得しようとするときは、gcov と VS のデバッグ ビルドを使用することをお勧めします。

于 2011-05-26T19:37:12.210 に答える
2

あなたが話している行は、リリースモードでインライン化されます。つまり、行自体は決してカウントされません (率直に言って、カウンターのインクリメントは、関数がインライン化される場所に移動された可能性があります... しかし、g++ はまだそれを実行していません)。

問題を解決する-gには、g++ コマンド ラインに追加して、すべてのデバッグを保持します。を定義したことも確認したいでしょう-D_DEBUG。実際、ドキュメントでは通常、 を使用するように指示されています-g

最後に、 による最適化を避けたいと考えてい-O0ます。

私の側では、-fprofile-arcsandも使用するのが好き-ftest-coverageです。

別の回答のコメントで述べたように、 and を使用する-fno-elide-constructors-fno-default-inline、「欠落している」コンストラクターとインライン関数のカバレッジにも役立つ場合があります。

開始ブレースにフラグが設定されていることに関して、g++ はコンストラクター (おそらくコピー コンストラクター) を作成し、それを最初のクラス宣言行に表示する可能性があります。そのように作成された他のコンパイラ固有の関数が存在する可能性があり、非常に複雑なテストケースなしではヒットできない場合があります...私は常にその問題に遭遇します。

クライマタイザーが提案したように、lcov を使用できます。これにより、すばやくブラウズできる読みやすい表を含む HTML が出力として提供されます。ここにそのような例があります:

http://lcov.csspp.org/csspp-1.0.5/lib/index.html

ご覧のとおり、ライブラリはすべてのテストで 100% カバーされています。しかし、どういうわけか、assemblyr.cpp ファイルには、1 つの機能がカバーされていないと書かれています。私が書いたコードの100%がカバーされているので、それがどの機能なのかわかりません...だから私はそれを無視します。

于 2015-08-02T02:47:04.293 に答える