标签: gcov

使用gcov,是否可以合并到.gcda文件?

我有相同的源文件(C和Obj-C)被编译成两个目标:单元测试可执行文件和实际产品(然后进行集成测试).这两个目标构建在不同的位置,因此目标文件.gcno和.gcda文件是分开的.并非所有源文件都编译到单元测试中,因此并非所有对象都存在.所有源文件都编译到产品构建中.

有没有办法将两组.gcda文件组合起来,以获得单元测试和集成测试的总覆盖率(因为它们在产品构建中运行)?

我正在使用lcov.

Mac OS X 10.6,GCC 4.0

谢谢!

gcc code-coverage gcov lcov

10
推荐指数
2
解决办法
9979
查看次数

使用gcov进行交叉配置,但忽略GCOV_PREFIX和GCOV_PREFIX_STRIP

我想使用GCOV进行代码覆盖,但测试将在另一台机器上运行.因此,可执行文件中.gcda文件的硬连线路径将无法正常工作.

为了改变这个默认目录我可以使用GCOV_PREFIX和GCOV_PREFIX_STRIP ENV瓦尔,因为它说这里.

这是我用过的命令:

$ export GCOV_PREFIX="/foo/bar"
$ export GCOV_PREFIX_STRIP="3"
$ gcc main.c -fprofile-arcs -ftest-coverage
$ strings a.out | grep gcda
/home/calmarius/blahblah/main.c.gcda
Run Code Online (Sandbox Code Playgroud)

路径保持不变.有人有这方面的经验吗?

c gcc gcov

10
推荐指数
2
解决办法
6918
查看次数

gcov和全球破坏者

MWE

#include <iostream>

struct Foo {
  Foo() {
    std::cout << "Constructing Foo " << this << std::endl;
  }

  ~Foo() {
    std::cout << "Destructing Foo " << this << std::endl;
  }
};

Foo global_foo;

int main () {
  std::cout << "Entering and exiting main()" << std::endl;
  return 0;
Run Code Online (Sandbox Code Playgroud)

}

问题

使用选项编译以上内容-fprofile-arcs -ftest-coverage,运行程序,然后运行gcov.程序输出清楚地表明按顺序调用Foo :: Foo(),main()和Foo :: ~Foo().gcov输出显示调用Foo :: Foo()和main(),但不调用Foo :: ~Foo().

根本原因

全局对象由GNU内部退出处理程序(使用at_exit()注册的函数)销毁.最终的gcov统计信息由另一个退出处理程序生成.gcov退出处理程序显然在全局销毁退出处理程序之前被调用,因此gcov看不到被调用的析构函数.

错误状态

这是gcov中一个古老的 bug.这是Bugzilla链接:http://gcc.gnu.org/bugzilla/show_bug.cgi?id = 7970.该错误在九年后仍然存在,至少在i686-apple-darwin10-g ++ - 4.2.1中存在.

这个问题

这是gcov中无法解决的错误,我必须忍受的东西,还是只是碰到裂缝(9岁而完全被遗忘)的东西?如果是后者,如何解决呢?

c++ g++ gcov

9
推荐指数
1
解决办法
698
查看次数

有没有办法将两个.gcda文件合并为一个?

我有一个应用程序的几个单元测试,每个单元测试都能够生成.gcda文件.我希望能够生成统一的.gcda文件,这些文件代表了整个测试套件的覆盖范围.似乎没有一种简单的方法可以做到这一点,但我可能是错的,这就是我要问的原因.

使用gcov,是否可以合并到.gcda文件?之前被问到,解决方案是转换为lcov .info文件并以这种方式合并.如果可能的话,我希望合并操作的输出仍然是单个.gcda文件,这样我就不会被迫使用lcov.

code-coverage gcov

9
推荐指数
1
解决办法
5487
查看次数

无论如何将两个gcov文件合并为一个

我在macosx平台上使用gcov进行覆盖测试.我按设置完成了xcode的配置:

1. Build Settings ==> Generate Test Coverage Files == Yes
2. Build Settings ==> Instrument Progaram Flow == Yes
3. Build Phases ==> Link Binary with library ==> add "libprofile_rt.dylib"
Run Code Online (Sandbox Code Playgroud)

然后生成文件" Test.d, Test.dia, Test.gcno, Test.gcda, Test.o"然后我使用gcov-4.2 -b Test.gcno命令生成Test.m.gcov文件(这是我想要的),但下次再次运行测试用例时,Test.d, Test.dia, Test.gcno, Test.gcda, Test.o将再次生成文件" ",数据将被重置.

所以我有两个问题:

  1. 有没有办法让我累积这些覆盖文件中的数据,以便我可以运行我的项目这么多次,然后在最后生成文件.
  2. 如果#1没有希望,你能告诉我如何将merge two Test.gcno文件(由两次"运行"生成)合二为一.我在终端尝试gcov,下面是gcov命令的选项:

    gcov-4.2 -help
    Usage: gcov [OPTION]... SOURCEFILE
    
    Print code coverage information.
    
      -h, --help                      Print this help, then exit
      -v, --version                   Print version number, …
    Run Code Online (Sandbox Code Playgroud)

code-coverage gcov

9
推荐指数
1
解决办法
5792
查看次数

编译googletest for gcov

我想从我的googletest测试中获取覆盖率信息,但我无法找到好的指示.

我相信我应该编译我GTEST二进制的,它吐出.gcno.gcna文件.但是,编译器标志的组合似乎不会发生这种情况.

我尝试过使用--coverage-fprofile-arcs -ftest-coverage编译和链接,但无济于事.

我只是在整个方法中弄错了吗?googletest测试会像这样编译吗?

为了完整性,这里是整个makefile:

# -*- indent-tabs-mode:t; -*-

## Vars
CXX=g++
BDDOBJ=../obj
OBDD_DIR=../src
OBDD_INCLUDE=-I$(OBDD_DIR)
#FLAGS=-Wfatal-errors -I./gtest-1.7.0/include  -L./gtest-1.7.0/lib/.libs -lgtest -lgtest_main -lpthread

GTEST_DIR=./gtest-1.7.0
SRCDIR=./src
OBJDIR=./obj
BINDIR=./bin
LIBDIR=./lib
VPATH=$(SRCDIR) $(OBJDIR) $(LIBDIR) $(BINDIR)
COVERAGE=-O0 -g --coverage

MKDIR=mkdir -p
RM=rm -rf

.PHONY: clean
.INTERMEDIATE: default $(BINDIR) $(OBJDIR) $(LIBDIR)

default: obddtest

#Binary
obddtest: $(BINDIR) libgtest.a Vertex.o Vertex_unittest.o Edge.o Edge_unittest.o Graph.o Graph_unittest.o main.o 
    g++ $(COVERAGE) -isystem ${GTEST_DIR}/include $(OBDD_INCLUDE) -pthread \
    $(OBJDIR)/Vertex.o \
    $(OBJDIR)/Vertex_unittest.o \
    $(OBJDIR)/Graph_unittest.o \
    $(OBJDIR)/Edge.o …
Run Code Online (Sandbox Code Playgroud)

c++ gcc googletest gcov

9
推荐指数
1
解决办法
4002
查看次数

Xcode 7生成GCOV

因此,Xcode 7中的热门新功能是集成在XCode中的代码覆盖 - yaaay!这一新功能也带来了Apple的新代码覆盖格式.profdata.

我们需要在Cobertura报告中显示代码覆盖率报告(在Jenkins中加载).目前没有办法转换.profdata为Cobertura XML报告(但它正在路上).

在那之前,我们需要依靠"旧"的gcov.由于某些未知原因,XCode 7生成.gcno和.gcda,但是当您gcovr创建Cobertura报告时,它显示所有文件的0%覆盖率(我们肯定有一些覆盖率).

我们试图回到XCode 6.4,生成的gcov文件在运行时显示正确的覆盖范围gcovr.

有人遇到过同样的问题吗?任何可能的解决方

code-coverage gcov gcovr xcode7

9
推荐指数
1
解决办法
2007
查看次数

如何让lcov表现得更快?

我遇到了lcov的性能问题.

我正在七个不同的配置文件中执行一个程序,收集每个配置文件的覆盖范围,然后将覆盖配置文件与lcov合并:

lcov --rc lcov_branch_coverage=1 -a coverage_1.dat -a coverage_2.dat -a coverage_3.dat -a coverage_4.dat -a coverage_5.dat -a coverage_6.dat -a coverage_7.dat -o coverage_full.dat
Run Code Online (Sandbox Code Playgroud)

然而,这非常缓慢.组合我的7个配置文件大约需要10分钟,这实际上比编译和运行7个配置文件要长.每个dat文件大约有1M行.

lcov --combinelcov --remove步骤非常缓慢的为好.每个人大约45秒.

有没有办法加快这个组合步骤?如果需要我可以使用几个线程,我有足够的内存.如果有其他工具能够正确地进行这种组合,我也会感兴趣(我已经尝试将文件转换为Cobertura并使用我发现的Python脚本进行合并,但它崩溃了).

如果完全有替代lcov,我也很感兴趣.我一直在使用gcovr,但有了它,我必须使用其他几种工具来进行组合并且它不是最佳的,但速度要快得多.

c++ gcc gcov lcov

9
推荐指数
1
解决办法
576
查看次数

在C++代码中查找非实例化的模板

在C++代码中查找未实例化模板的最佳方法是什么?

我有一个大量使用模板的代码库.当然,我们希望确保测试覆盖率很高.对于所有使用的代码,这非常有效gcov.

但是,未使用的模板将报告为不可执行的gcov.

经过一些谷歌搜索,似乎没有办法强制g++发出这些模板的代码(这只是逻辑,编译器应该如何猜测任何类型?)似乎也没有办法让gcov识别未实例化的模板代码作为可运行的代码.

有没有"开箱即用"的东西可以让我增加GCC -ftest-coverage -fprofile-arcs仪器生成的文件?通过GCCgcov选项文档,将整个模板函数体标记为一个块可能就足够了,因为执行永远不会在那里结束.

编辑(背景信息):我正在开发一个仅限标题的模板库.我的目标是找到未使用/未经测试的功能.

我知道代码覆盖是有缺陷的,但找到未经实例化的代码是迈向更好测试代码的非常重要的一步.目前,我们将检查点宏放在每个函数的开头.在测试模式中,它们扩展为将一对(file, line)插入全局传递检查点的代码.运行测试后,我们手动读取所有文件,并将到达的检查点与所有可用检查点的集合进行比较.

查找未实例化的代码很重要,例如,由于不直观的C++模板优先级行为,可能存在读者甚至作者期望使用的死代码.

c++ templates code-coverage gcov

8
推荐指数
1
解决办法
1367
查看次数

Libtool为对象添加前缀,但gcov要求它们没有前缀

我需要gcov在我正在处理的共享库上执行一些测试覆盖.

问题是libtool将目标文件重命名为my-name.c,libmylib_la-my-name.lo并且gcov无法处理该转换.每次运行它时,cannot open notes file都会生成错误.

如果我手动重命名my-name.clibmylib_la-my-name.c后构建gcov工作正常,所以没有其他问题,除了文件名截断.

附录

试图提供一个最小的工作示例,我发现文件名修改只在lib..._la_CFLAGS设置时(以及设置为空值时)发生.

cat <<EOT > configure.ac
AC_INIT(sample,0.0.1)
AC_CONFIG_SRCDIR(configure.ac)
AM_INIT_AUTOMAKE(foreign)
LT_INIT
AC_PROG_CC
AC_CONFIG_FILES(Makefile)
AC_OUTPUT
EOT

cat <<EOT > Makefile.am
lib_LTLIBRARIES=libsample.la
libsample_la_SOURCES=sample.c
# The following line triggers the filename mangling (libsample_la-sample.lo instead of sample.lo)
libsample_la_CFLAGS=
EOT

touch sample.c && autoreconf -if && ./configure && make
Run Code Online (Sandbox Code Playgroud)

有没有办法避免libtool操作的文件名修改或让我们gcov理解文件名修改方案?

c gcc autotools libtool gcov

8
推荐指数
1
解决办法
708
查看次数

标签 统计

gcov ×10

code-coverage ×5

gcc ×5

c++ ×4

c ×2

lcov ×2

autotools ×1

g++ ×1

gcovr ×1

googletest ×1

libtool ×1

templates ×1

xcode7 ×1