c++ - .gcda 文件不会在多次运行时合并

标签 c++ clang code-coverage profile gcov

我有两个使用通用 C++ 类的主要函数。

文件 1: main.cpp

   #include <iostream>
   #include "HelloAnother.h"

   int main() {
       HelloAnother::sayHello1();
       return 0;
   }

文件2:main2.cpp

   #include <iostream>
   #include "HelloAnother.h"

   int main() {
       HelloAnother::sayHello2();
       return 0;
   }

文件 3:HelloAnother.h

   #pragma once
    class HelloAnother {
        public:
         static void sayHello1();
         static void sayHello2();
    };

文件4:HelloAnother.cpp

#include <iostream>
#include "HelloAnother.h"
void HelloAnother::sayHello1() {
    std::cout << "Hello 1!!!" << std::endl;
}

void HelloAnother::sayHello2() {
    std::cout << "Hello 2 !!!" << std::endl;
}

现在我编译两个可执行文件: clang-3.8 -o main -fprofile-arcs -ftest-coverage --coverage -g -fPIC -lstdc++ main.cpp HelloAnother.cpp

clang-3.8 -o main2 -fprofile-arcs -ftest-coverage --coverage -g -fPIC -lstdc++ main2.cpp HelloAnother.cpp

现在,我运行 ./main

Hello 1!!!

当我重新运行 ./main

Hello 1!!!

profiling: /media/sf_ubuntu-shared/test-profiling/main.gcda: cannot map: Invalid argument profiling: /media/sf_ubuntu-shared/test-profiling/HelloAnother.gcda: cannot map: Invalid argument

第二次运行时,我在尝试创建/合并 .gcda 文件时遇到此错误(如上)。

现在,如果我尝试运行 ./main2

Hello 2 !!!

profiling: /media/sf_ubuntu-shared/test-profiling/HelloAnother.gcda: cannot map: Invalid argument

当我生成代码覆盖率报告时,对第二个函数的调用没有显示出来,就好像没有进行调用一样。

任何人都可以帮我调试这个问题吗?该问题似乎与多次运行时合并 .gcda 文件有关,但不确定如何解决。

我也尝试了 clang-3.5 但结果相同。

最佳答案

经过大量搜索和试验/错误后,这对我有用:

  1. 编译第一个可执行文件,运行它。这会生成 HelloAnother.gcda 和 main.gcda 文件。
  2. 执行 lcov --gcov-tool=gcov-4.4 --directory 。 --capture --output-file coverage.main.info
  3. rm -rf *.gcda; rm -rf *.gcno
  4. 编译第二个可执行文件(main2.cpp),运行它。这会生成另一个 HelloAnother.gcda 和一个 main2.gcda 文件。
  5. 执行 lcov --gcov-tool=gcov-4.4 --directory 。 --capture --output-file coverage.main2.info
  6. 现在要生成漂亮的 html 报告,请执行以下操作:genhtml -o coverage coverage.main.info coverage.main2.info

关于c++ - .gcda 文件不会在多次运行时合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38492859/

相关文章:

c++ - 如何在 std::set 中选择随机元素?

c - C 中有效的 printf() 语句

haskell - 我如何使用新的 cabal 生成 HTML 代码覆盖率报告?

TFS 2015 中的 Javascript 单元测试代码覆盖率

c++ - 从 QTreeView 中删除项目时取消选择所有行

c++ - 如何防止构造类的对象?

c++ - clang 是否已经支持 C++11?

c++ - 如何使用libc++ libstdc++混合编译的链接库

java - 清除 Eclipse 中突出显示的覆盖范围

c++ - 将具有二进制的 QString 转换为具有十六进制的 QString