2016-08-31 2 views
2

2つのコンパイラフラグがわかります。-ftest-coverage -fprofile-arcsをGCCでコードカバレッジを取得するために渡す必要があります。 私の質問は、カバレッジを得るための2つのコンパイラフラグを持つ理由は何ですか。また、独立して使用すると、何が得られますか?GCCでコードカバレッジに2つのコンパイラフラグを渡す必要がある理由

私は、-fprofile-arcsフラグだけでcプログラムをコンパイルしようとしました。私は違いを気付かなかった。 .gcno .gcdaとgcovのファイル

+2

オプションについての[ドキュメントを読む](https://gcc.gnu.org/onlinedocs/gcc-6.2.0/gcc/Instrumentation-Options.html#Instrumentation-Options)に、実際に何が表示されていますか行う? –

+0

はい、私は文書を見に行っていました..しかし、なぜ2つのフラグがあるかについて明確ではなく、1つのフラグ(-fprofile-arc)が目的を果たす – MSK

答えて

2

を生成することができたあなたは-fprofile-arcsためthe documentationをチェックする場合は、それが生成するデータは、他のオプションに応じて、2つの異なるものを使用することができることがわかります:-ftest-coverage-fbranch-probabilities

したがって、-fprofile-arcsは、計装を行い、データを保存するコードを生成することです。次に、実行する分析によって、-ftest-coverageまたは-fbranch-probabilitiesのいずれかを使用してデータを特殊化します。

これはどこにも言いませんが、特殊化フラグが1つも指定されていない場合、GCCのデフォルトは-ftest-coverageになります。

2

あなたが明示的に述べてthis documentationを参照し、GCCのコードカバレッジを取得するためにgcovのツールを使用したい場合:gcovのを使用する場合は、あなたが最初のGCCの2つの特別なオプションを使用してプログラムをコンパイルしなければなりません

: '-fprofile-arcs -ftest-coverage'です。これは、gcov(基本的にはプログラムのフローグラフ)に必要な追加情報を生成するようにコンパイラに指示します。また、gcovに必要な追加のプロファイリング情報を生成するためのオブジェクトファイルにコードを追加します。

より正確には、Instrumentation Optionsを参照することにより、二つのフラグについての私の理解は以下の通りです:

  • -fprofile-arcsは、あなたのプログラムの各分岐が取られる回数を示す情報を生成します。言い換えれば、これによりプログラムはその実行に関連して余分なデータを生成します。情報は.gcdaファイルに格納されます。
  • -ftest-coverage
  • -fprofile-arcsによって生成される情報を使用して、人間が読める .gcovファイルを生成するためにgcovの使用することができ、制御フロー情報を含む .gcnoファイルを生成します。 -fprofile-arcsで取得したテストカバレッジデータがなければ、何も意味をなさないでしょう。

-fprofile-arcsはまた、他のフラグなど-fbranch-probabilities(詳細here)と組み合わせることができます。通常、このフラグを使用する場合、コンパイラは、.gcdaファイルに含まれるプロファイリング情報に基づいて、分岐予測を改善するための最適化を実行します。 -fprofile-arcs-fbranch-probabilitiesは、-fprofile-generate-fprofile-useを使用すると自動的に有効になります(プロファイルガイド付き最適化とGCCを実行する標準的な方法です)。

希望すると便利です。

関連する問題