将gcov与子进程和共享库一起使用时无法覆盖

时间:2013-11-22 15:29:13

标签: c++ testing code-coverage gcov

我正在使用gcov来生成一个生成子进程的c ++测试可执行文件。子进程包含一个共享对象库。测试进程,子进程和共享对象库都在不同的目录中编译。我使用-fprofile-arcs -ftest-coverage标志进行编译和链接。当我编译时,我得到子进程和共享库的.gcno文件。但是当我运行可执行文件时,我只能获得父进程的覆盖输出。

我的问题是,是否有任何特殊步骤可以通过共享库来覆盖此子进程?

gcc帮助论坛问题here(关于带共享对象库的gcov)解释了共享库必须与运行可执行文件的目录构建在同一目录中。

这是否意味着为了获得测试覆盖率,我必须在同一目录中编译每个组件(父测试进程,子进程和共享对象库)?

1 个答案:

答案 0 :(得分:0)

以下是我为gcov工作所做的工作......

  1. 我在各自的目录中编译了共享对象库和两个可执行文件,并确保在编译和链接它们时使用这些标志(-fprofile-arcs -ftest-coverage)。事实证明这些二进制文件的位置并不重要。重要的是使用标志,允许gcc检测代码。

  2. 我将生成的.so和两个可执行文件复制到一个目录中。

  3. 然后我运行了测试可执行文件,它开始(分叉)链接到共享对象库的另一个(子)可执行文件。

  4. 作为运行可执行文件的结果,为每个.cpp生成了一个.gcno文件。每个.gcno文件都位于与其对应的.cpp文件相同的位置。

  5. 然后我在我希望代码覆盖的源文件上运行“gcov * .cpp”。

  6. 执行步骤5会为我运行gcov的每个.cpp生成一个.gcda文件。这些是显示代码覆盖率的实际文件。在您喜欢的编辑器中打开它们并查看。