16

gcov のカバレッジ情報を取得するのに苦労しています。コンパイルおよびリンク中にエラーは発生しませんが、実行可能ファイルを実行すると、カバレッジ データが生成されません。

私は別のビルド ディレクトリで CMake を使用しており、次のようにコンパイラとリンカーにフラグを渡しています。

add_definitions(--coverage)
set(CMAKE_EXE_LINKER_FLAGS ${CMAKE_EXE_LINKER_FLAGS} " --coverage")

実行可能ファイルは、ソース コードが特定の場所にあることを想定していますか? 物事を進めるには、CMakeLists.txt に何を追加する必要がありますか?

敬具、ビョルン

4

4 に答える 4

16

CMake は、コード カバレッジ (*.gcda、*.gcdo) ファイルをプロジェクトのオブジェクト ファイルと共に配置するようです。実行可能ファイルの名前が「tester」の場合、次のパスに表示されます

${CMAKE_BINARY_DIR}/CMakeFiles/tester.dir/

ただし、CMake は gcov とあまり互換性のない方法でソース ファイルに名前を付けているようです。たとえば、「mytestprog.cpp」というソース ファイルがある場合、それはビルドされます。

mytestprog.cpp.o
mytestprog.cpp.gcda
mytestprog.cpp.gcdno

gcovが期待しているように見える場所

mytestprog.gcda
mytestprog.gcdno

修正方法がよくわかりません。代わりに LCov を使用してみましたが、動作するように見えましたが、実際に動作したかどうかはわかりません。

于 2012-02-23T00:34:51.540 に答える
13

Delcypher は問題を指摘しました。

解決策 1:文書化されていないスイッチを使用して、cmakeオブジェクト ファイルの名前main.oを etc ではなくas にするように要求できます。main.cpp.oCMAKE_CXX_OUTPUT_EXTENSION_REPLACE

cmake -DCMAKE_CXX_OUTPUT_EXTENSION_REPLACE=ON ...

解決策 2:ビルド ディレクトリから.gcov呼び出すことができるファイルが必要ない場合:lcov

lcov --capture --directory . --output-file coverage.info
genhtml coverage.info --output-directory out

カバレッジ情報は、outディレクトリ内に html 形式で表示されます。

于 2016-10-18T14:19:39.083 に答える
2

どこから得たのかわかりません--coverageが、これらは Linux で gcc と gcov を使用してカバレッジ情報を取得するために使用する引数です。

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fprofile-arcs -ftest-coverage")
set(CMAKE_EXE_LINKER_FLAGS
    "${CMAKE_EXE_LINKER_FLAGS} -fprofile-arcs -ftest-coverage")

これらのオプションについては、次のようgcc --help --verboseに説明します。

-ftest-coverage 「gcov」が必要とするデータファイルを作成する

-fprofile-arcs arc ベースのプログラム プロファイリング コードを挿入する

于 2011-05-22T19:14:33.513 に答える
1

--coverageをリンカに渡す必要はありません。--coverageは、-fprofile-arcs -ftest-coverageをコンパイラーに渡し、-lgcovをリンカーに渡します。

gcdoまたはgcdaファイルを作成していないことを確認しますか?これらのファイルをどこで探していますか?各オブジェクトファイルのgcovファイルをオブジェクトファイルと同じディレクトリに配置する必要があります。ビルドディレクトリの上部にある.gcdaファイルを検索します。何も表示されない場合は、gcovがリンクされていない可能性があります。次のコマンドを実行して、リンクされているかどうかを確認します。

nm name_of_binary | grep "gcov"

リンクインされている場合、gcovには、実行可能ファイルを実行している場所にファイルを書き込む権限がない可能性があります。それが許可を持っているなら、私は困惑しています。

于 2011-05-23T15:08:33.560 に答える