无法使用lcov生成覆盖率报告

时间:2016-11-16 21:43:59

标签: gcc jenkins code-coverage gcov lcov

我正在尝试使用lcov为我的单元测试套件生成覆盖率报告,但我甚至无法捕获跟踪文件。错误消息表明找不到源文件。代码由构建机器上的Jenkins作业编译,单元测试作为目标机器上的下游作业执行。源代码和gcno文件被转移到下游作业,然后执行对lcov的调用。以下是所有细节,可能需要一杯咖啡。

在构建机器上,make在

中执行
/var/lib/jenkins/workspace/App-Coverage/BUILD/app/

我要覆盖的源代码位于

中的子目录中
/var/lib/jenkins/workspace/App-Coverage/BUILD/app/packages/

目标文件和gcno文件是在相对于相应cpp文件的子目录o中生成的。例如,

/var/lib/jenkins/workspace/App-Coverage/BUILD/app/packages/subdir/Myclass.cpp
/var/lib/jenkins/workspace/App-Coverage/BUILD/app/packages/subdir/o/Myclass.o
/var/lib/jenkins/workspace/App-Coverage/BUILD/app/packages/subdir/o/Myclass.gcno

源文件和gcno文件被复制到单元测试机器,保持相同的文件夹结构并最终进入

/var/lib/jenkins/workspace/App-Coverage-Unittest/BUILD/app/

Note: There is a difference in the name of the workspace folder, "App-Coverage-Unittest" instead of "App-Coverage" since these two Jenkins jobs cannot have the same name.

现在有例如

/var/lib/jenkins/workspace/App-Coverage-Unittest/BUILD/app/packages/subdir/Myclass.cpp
/var/lib/jenkins/workspace/App-Coverage-Unittest/BUILD/app/packages/subdir/o/Myclass.o
/var/lib/jenkins/workspace/App-Coverage-Unittest/BUILD/app/packages/subdir/o/Myclass.gcno

单元测试在

中执行
/opt/app/test/app

使用GCOV_PREFIX_STRIP和GCOV_PREFIX我使gcda文件出现在与gcno文件相同的文件夹中,例如

/var/lib/jenkins/workspace/App-Coverage-Unittest/BUILD/app/packages/subdir/o/Myclass.gcno
/var/lib/jenkins/workspace/App-Coverage-Unittest/BUILD/app/packages/subdir/o/Myclass.gcda

现在我想使用lcov生成一个覆盖率报告,但我似乎不明白如何正确设置路径。以下示例从/ var / lib / jenkins / workspace / App-Coverage-Unittest / Jenkins unittest作业执行。

例如我试过

lcov -d BUILD/app/packages/ -c --no-external -o app.info -b /var/lib/jenkins/workspace/App-Coverage-Unittest/BUILD/app/

推理:“-d BUILD / app / packages /”是我要覆盖的内容,“-b / var / lib / jenkins / workspace / App-Coverage-Unittest / BUILD / app /”是我的根源我执行make的项目(但在具有不同工作区名称的构建机器上......)。

我也试过

lcov -d BUILD/app/packages/ --capture --no-external --output-file app.info

推理:“-d BUILD / app / packages /”是我想覆盖的,不要设置-b,因为每个gcno / gcda和相应的源文件之间的相对路径与构建机器上的相对路径相同,也许lcov可以搞清楚。

在这两种情况下都会出现“无法打开源文件/var/lib/jenkins/workspace/App-Coverage/BUILD/app/packages/subdir/Myclass.cpp”之类的错误 注意:此路径中的工作空间文件夹是构建计算机的文件夹,而不是unittest计算机。我认为这是-b选项打算解决的问题。显然,这是非常可疑的,也是一个有价值的线索。 我也得到像“无法打开源文件../../../packages/subdir/Myclass.h”这样的错误,我想这与我如何包含头文件有关。

我试过在这里指定所有路径。是否可以使用lcov在unittest作业的工作区中生成覆盖率报告,就像我在这里尝试一样?如果是,哪些是为lcov -d和-b标志指定的正确路径?如果没有,我需要更改什么才能使其正常工作?

1 个答案:

答案 0 :(得分:2)

幸运的是答案是肯定的,这是可能的。我得到了lcov dev的回复,为我提供了解决方案,谢谢Peter!

他指出所有源代码路径在编译步骤中都是硬编码到.gcno文件中。但是,尽管没有找到源文件(并产生警告),lcov将生成代码覆盖输出,即使在找不到源代码时也是如此,完全基于.gcda和.gcno文件中的数据。但是,genhtml步骤将失败,因为它无法找到要使用代码覆盖率数据进行注释的源代码。

解决方案是使用lcov" geninfo_adjust_src_path"配置设置。通过使用此设置,指示lcov在写入输出.info文件时将.gcno文件中的源代码路径更改为正确的源代码路径。所以在我的情况下:

lcov -d BUILD/app/packages/ --capture --no-external --output-file app.info
     --rc geninfo_adjust_src_path="/var/lib/jenkins/workspace/App-Coverage/BUILD/ 
     => /var/lib/jenkins/workspace/App-Coverage-Unittest/BUILD/"

警告"无法打开源文件"在调用lcov时仍然存在,但生成的.info文件将包含正确的路径,因此可以使用genhtml在测试机器上转换为HTML。