問題タブ [gcov]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - Python プロセスで呼び出される C ライブラリのカバレッジを測定する
Python からライブラリ コードを呼び出す例から始めましょう。
これはライブラリ コードです ( library にコンパイルされますlibfoolib
)。
これは、それを呼び出す python コードです。
ライブラリがコンパイルされ-ftest-coverage
、-fprofile-arcs
コンパイラがファイルを適切に生成gcno
すると、Pythonコードが実行されると、gcda
ファイルも生成されます。bar
問題は、python の fork の前に呼び出される関数のカバレッジ番号のみが含まれていることです。foo
Python の処理呼び出しの外でも呼び出された場合は、すべて問題ありません。
gcov
生成されたカバレッジ データに対してツールを実行すると、次のようになります。
foo
私が持っている質問は、「カバレッジ データはどこにありますか?」ということです。
環境に関する詳細:
- CentOS 5.4
- gcc: 4.1.2 20080704 (レッドハット 4.1.2-46)
- CMake ビルド (バージョン 2.8.0)
- パイソン2.5
- python to C は SIP (バージョン 4.7.4) を使用します
gcc - gcov 最終リンクに失敗しました
gcov サポートを使用してプロジェクトをコンパイルしているときに、次のエラーに直面しています
以下は、コンパイル中に持っているフラグ情報です
コンパイラ フラグ:
リンカー オプション:
バージョン情報は次のとおりです。
gcc バージョン:
gcc バージョン 4.1.2 20080704 (Red Hat 4.1.2-44)
gcov バージョン:
gcov (GCC) 4.1.2 20080704 (レッドハット 4.1.2-44)
エラー:
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/libgcov.a(_gcov.o) の隠しシンボル `__gcov_init' が DSO /usr/bin/ld によって参照されています: 最終的なリンクに失敗しました: 出力の表現できないセクションcollect2: ld が 1 つの終了ステータスを返しました
この問題から逃れるために私を助けてくれませんか?
c++ - 別のビルド ディレクトリを使用した CMake による gcov
gcov のカバレッジ情報を取得するのに苦労しています。コンパイルおよびリンク中にエラーは発生しませんが、実行可能ファイルを実行すると、カバレッジ データが生成されません。
私は別のビルド ディレクトリで CMake を使用しており、次のようにコンパイラとリンカーにフラグを渡しています。
実行可能ファイルは、ソース コードが特定の場所にあることを想定していますか? 物事を進めるには、CMakeLists.txt に何を追加する必要がありますか?
敬具、ビョルン
c++ - カバレッジを改善するために gcov 出力を解釈するためのヒントは何ですか?
プロジェクトで gcov を正常に使用しています。
- gcov フラグを使用してプロジェクトをビルドできます。
-fprofile-arcs -ftest-coverage
-lgcov
オプションと連動- 単体テスト プログラムを実行すると、多数の
gcda
andgcno
ファイルが生成されます。 - gcov を何度も実行すると、大量の
gcov
ファイルが生成されます。 - 結果を要約し、次のような行のリストを作成します。
#####: 42: virtual double run_time() const { return 0; }
私はそれから「ドッ!」に行きます。不足しているメソッドを呼び出すテストを作成します。
上記の例の行は非常に簡単に診断できます.gcovは、私が呼び出していない正確なメソッドを教えてくれました.
gcov によってフラグが付けられたコピー コンストラクターの例もありましたが、Visual Studio デバッガーを使用してステップ実行できます。そこでの解決策は、gcov がコピーを省略した RVO に苦しんでいることを認識することでしたが、コピーを強制するテストを作成することでそれが修正されました。
私が理解できない他の例がいくつかあります。
gcov は、ファイルの最後の行である名前空間の右中括弧にフラグを立てているようです。
ここで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.
c++ - dlopen() を使用して開かれたライブラリのカバレッジを見つける方法は?
別のアプリケーションで dlopen() を使用して開かれる C++ ライブラリ (.so) があります。しかし、gcov を使用してアプリケーション内で実行している間に、このライブラリのコード カバレッジを見つける必要があります。出来ますか?はいの場合、どのように行うことができますか?
そうでない場合、問題はどのように解決できますか?
c++ - gcov とグローバル デストラクタ
MWE
}
問題
上記を options-fprofile-arcs -ftest-coverage
でコンパイルし、プログラムを実行してから gcov を実行します。プログラム出力は、Foo::Foo()、main()、および Foo::~Foo() がこの順序で呼び出されていることを明確に示しています。gcov の出力は、Foo::Foo() と main() が呼び出されていることを示していますが、Foo::~Foo() は呼び出されていません。
根本的な原因
グローバル オブジェクトは、GNU 内部終了ハンドラー (at_exit() で登録された関数) によって破棄されます。最終的な gcov 統計は、別の終了ハンドラーによって生成されます。gcov 終了ハンドラーは明らかにグローバル破棄終了ハンドラーの前に呼び出されるため、gcov はデストラクタが呼び出されていることを認識しません。
バグの状態
これはgcovの古くからあるバグです。Bugzilla のリンクは次のとおりです: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=7970。このバグは 9 年経った今でも、少なくとも i686-apple-darwin10-g++-4.2.1 には存在しています。
質問
これは gcov の解決不可能なバグであり、私が対処しなければならないものですか、それともたまたま見過ごされたものですか (9 年前のことで、完全に忘れられています)。後者の場合、どのように修正しますか?
c++ - 単体テストの実行には時間がかかります。ヴァルグラインドの問題?Gcovの問題?
現在取り組んでいるプロジェクトの単体テスト スイートを作成しました。私の単体テストは非常に速く実行されていました... 200 以上のテストが数秒以内に実行されました。通常、各テストにかかる時間は 10 ミリ秒未満です。Valgrind と Gcov を使用すると、各テストの実行に 1.5 分以上かかる場合があります。非常に遅い単体テストを経験した人はいますか? Valgrind、gcov、または Google Test は、特定の状況でプログラムの実行を大幅に遅くしますか? さらに紛らわしいのは、ユニット テストの一部は問題なく (つまり、非常に速く) 実行される一方で、他のテストは実行に数秒かかることです。また、単体テストを再度実行すると、同じテストでも実行にかかる時間が異なることがよくあります。私は基本的にボトルネックがどこにあるかを把握しようとしています。以下に例を示します。
code-coverage - 2 つの .gcda ファイルを 1 つにマージする方法はありますか?
アプリケーションの単体テストがいくつかあり、それぞれが .gcda ファイルを生成できます。テスト スイート全体のカバレッジを表す統合 .gcda ファイルを生成できるようにしたいと考えています。これを行う簡単な方法はないようですが、間違っている可能性があるため、質問しています。
gcov では、.gcda ファイルにマージできますか? 以前に質問され、解決策は lcov .info ファイルに変換し、その方法でマージすることでした。可能であれば、マージ操作の出力を単一の .gcda ファイルのままにして、lcov の使用を強制されないようにしたいと考えています。
html - geninfo/genhtml で使用されるファイルを除外する方法を探しています
geninfo と genhtml (gcovr の代替、こちらを参照) を使用して、gcov によって提供されるカバレッジを使用して html ページを作成しようとしています。
geninfo
gcov の *.gcda ファイルから lcov-tracefiles を作成しますgenhtml
上記のトレースファイルから html ファイルを生成します
ただし、最終結果にはコードだけでなく、/usr/include のファイルも含まれます。
これらを除外する方法を知っている人はいますか?
マニュアルページを見てみましたが、何も見つかりませんでしたhttp://linux.die.net/man/1/geninfo
c - プログラムが中止された場合でも gcov に強制的にデータを抽出させる方法
私は KLEE と呼ばれるテスト生成ツールを使用しています。これは、私の C99 コード用に多くのテストを作成します。その後、テストを実行し、gcov でライン カバレッジをチェックします。Gcov は、実行が正常に完了すると、実行の最後にカバレッジ データを更新するようです。
ただし、一部のテストは失敗し (true でない assert ステートメント)、プログラムが中止され、gcov はこの実行でカバーされた行をカウントしません。
gcov が (成功した場合だけでなく) 終了時に情報をフラッシュする方法はありますか?