は、次のコマンドを考えてみましょう:GCCのコードカバレッジオプションはどのように機能しますか?
gcc -fprofile-arcs -ftest-coverage main.c
それは、カバレッジ解析を生成するために、gcovので使用されるファイル、main.gcdaを生成します。 main.gcdaはどのように生成されますか?計装はどのように行われますか?計測コードを表示できますか?
は、次のコマンドを考えてみましょう:GCCのコードカバレッジオプションはどのように機能しますか?
gcc -fprofile-arcs -ftest-coverage main.c
それは、カバレッジ解析を生成するために、gcovので使用されるファイル、main.gcdaを生成します。 main.gcdaはどのように生成されますか?計装はどのように行われますか?計測コードを表示できますか?
.gcdaは、コンパイラによって生成されていません。実行するとプログラムによって生成されます。
.gcnoはコンパイル時に生成されるファイルで、「ノートファイル」です。 gccは各CU(コンパイラユニット)の基本ブロックグラフノートファイル(.gcno)を生成します。
main.gcdaはどのように生成されますか?
実行時に、統計データが収集され、メモリに保存されます。いくつかの終了コールバックが登録され、プログラム終了時に.gcdaファイルにデータを書き込むために呼び出されます。つまり、プログラムでexit()の代わりにabort()を呼び出すと、.gcdaファイルは生成されません。
計測はどのように行われますか?計測コードを表示できますか?
詳細を知るにはgccの実装をチェックする必要がありますが、基本的にインストルメンテーションはプログラムに命令を挿入して各命令の実行回数をカウントすることによって行われます。しかし、実際には各命令のカウンタを保持する必要はありません。 GCCはいくつかのアルゴリズムを使用してプログラムフローグラフを生成し、グラフのスパニングツリーを見つけます。いくつかの特別なアークのみが計装されなければならず、それらからすべてのコードブランチのカバレッジが生成されます。 バイナリを逆アセンブルして計測コードを表示することができます。
toplev.c coverage.c profile.c libgcov.c gcov.c gcovの-IO:あなたはgccのソースファイルに見たい場合は そして、ここでは、カバレッジのためのいくつかのファイルです。C
編集:いくつかの既知のgcovのバグFYI:
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49484
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=28441
Can I see the instrumented code?
あなたはgcdaファイルのようなインストルメントデータを見ることができません。
Gcovの仕組みは?
1. Code instrumentation during compilation
2. Data collection during code execution
3. Data extraction at program exit time
4. Coverage analysis and presentation post-mortem.
uは、このPDFファイルを通過することができ、個々の手順についての詳細を知るために:
gcovのは、4つのフェーズで動作します。
http://ltp.sourceforge.net/documentation/technical_papers/gcov-ols2003.pdf
感謝!!カバレッジのためにそれらのファイルをどのようにトレースしましたか? –
gcovを使ったことがあり、いくつかの問題が発生しましたので、その実装を検討しなければなりませんでした。私はいくつかの既知のバグを追加しましたが、最近のgccで解決されるかもしれません。 – tristan
バグ49484は修正済みと表示されます。 – Technophile