【问题标题】:.gcda files don't merge on multiple runs.gcda 文件不会在多次运行时合并
【发布时间】:2023-03-12 03:11:01
【问题描述】:

我有两个使用通用 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

你好 1!!!

当我重新运行./main

你好 1!!!

分析:/media/sf_ubuntu-shared/test-profiling/main.gcda:无法映射:无效参数 分析:/media/sf_ubuntu-shared/test-profiling/HelloAnother.gcda:无法映射:无效参数

运行一秒钟,我在尝试创建/合并 .gcda 文件时收到此错误(上图)。

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

你好 2 !!!

分析:/media/sf_ubuntu-shared/test-profiling/HelloAnother.gcda:无法映射:无效参数

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

谁能帮我调试一下这个问题吗?该问题似乎与多次运行合并 .gcda 文件有关,但不确定如何解决。

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

【问题讨论】:

  • 您的操作系统及其版本是什么?您是从这个操作系统安装 clang 还是自己构建的?
  • $ uname -a : Linux pratik-ubuntu 4.2.0-27-generic #32~14.04.1-Ubuntu SMP Fri Jan 22 15:32:26 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux 我使用 apt-get install 安装了 clang。
  • 顺便说一句,忘了提一下,我正在使用主机 Mac OSX 安装在 VirtualBox 上的 Ubuntu 工作
  • 这是 14.04.1 ubuntu,它应该在硬件或 virtualbox 中相同。

标签: c++ clang code-coverage profile gcov


【解决方案1】:

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

  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

【讨论】:

  • 我认为你不应该从同一个源目录编译两个可执行文件。
  • 为什么这应该是@osgx 的限制?我们的用例是将多个单元测试编译为可执行文件并一个接一个地运行。
猜你喜欢
  • 2014-09-23
  • 2015-05-18
  • 2011-03-11
  • 2013-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多