2014-12-03 61 views
2

我試圖收集在Ubuntu上有C++和c代碼的項目的代碼覆蓋率。gcov爲c生成空覆蓋

我使用'-fprofile-arcs'和'-ftest-coverage'值作爲CXXFLAGS和CFLAGS; '-lgcov'作爲LINKFLAGS。

常見的C項目結構是:

c_code\ 
    src 
    unit_tests 

src包含靜態庫的來源。

unit_tests dir包含用googletest框架e編寫的測試。 G。種類測試

TEST_F(test_case_name, test_name) { 
    some_gtest_assertions; 
} 

構建googletest二進制文件之後,應該包含要在其中進行測試的靜態庫。

構建並運行項目二進制文件會導致生成* .gcno和* .gcda文件。但是我的C覆蓋結果是空的(C++生成的很好)。

LCOV命令有folloiwng格式:

lcov --capture --directory my_c_gcda_location --output-file c_coverage.info 

LCOV的日誌顯示了C-相關gcda文件如下:

的gcov沒有爲「my_c_gcda_location創建任何文件/ * gcda 「`

也有一種錯誤:

* .gcda:與筆記戳不匹配文件

我應該指定一些額外的參數或進行一些額外的動作來獲得對C的覆蓋效果?或者這些問題的原因是什麼?

+0

您必須提供'最低可驗證代碼',顯示'my_c_gcda_location'是如何處理/創建文件的,或者除了猜測外沒有人可以做任何事情。沒有明確問題陳述的問題對其他讀者無益。請參閱:[**如何創建一個最小,完整和可驗證的示例**](http://stackoverflow.com/help/mcve)。「 – 2014-12-03 16:11:59

回答

0

當.gcda文件比.gcno文件更新時,可能會出現「郵戳不匹配」。

它可能發生的主要原因有兩個: 1.您可能在運行測試之後和跟蹤文件生成之前重新生成代碼。 2.二進制文件可能內置在一臺機器上,並且測試在另一臺機器上運行,其時間超過了構建機器。

對於這兩種情況,您必須確保.gcda的文件創建時間大於.gcno和.c *文件。

您可以通過僅執行「touch * .gcda」來執行此操作,然後運行lcov命令。

+0

最後,我找出第二個重建被觸發的位置(靜態和共享圖書館都建成了)關閉共享庫的構建(作爲靜態覆蓋足夠用於我的目的)解決了問題 – Evgeny 2015-05-21 07:03:46

+0

touch不起作用,看起來像時間戳在實際文件內容中(與inode時間戳相比)即,'hexdump -e'「%x \ n」'-s8 -n4 myclass.gcda'。請參閱http://bobah.net/d4d/tools/code-coverage-with-gcov - 疑難解答。 – 2015-10-05 22:41:03