【问题标题】:No coverage when using gcov with child process and shared library将 gcov 与子进程和共享库一起使用时没有覆盖
【发布时间】:2013-12-07 13:09:59
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c++ testing code-coverage gcov


    【解决方案1】:

    这是我为使 gcov 正常工作所做的工作......

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-07-05
      • 2012-11-03
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 2022-01-24
      • 1970-01-01
      • 2016-02-22
      相关资源
      最近更新 更多