2014-12-03 62 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