我有相同的源文件(C和Obj-C)被编译成两个目标:单元测试可执行文件和实际产品(然后进行集成测试).这两个目标构建在不同的位置,因此目标文件.gcno和.gcda文件是分开的.并非所有源文件都编译到单元测试中,因此并非所有对象都存在.所有源文件都编译到产品构建中.
有没有办法将两组.gcda文件组合起来,以获得单元测试和集成测试的总覆盖率(因为它们在产品构建中运行)?
我正在使用lcov.
Mac OS X 10.6,GCC 4.0
谢谢!
我想使用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)
路径保持不变.有人有这方面的经验吗?
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岁而完全被遗忘)的东西?如果是后者,如何解决呢?
我有一个应用程序的几个单元测试,每个单元测试都能够生成.gcda文件.我希望能够生成统一的.gcda文件,这些文件代表了整个测试套件的覆盖范围.似乎没有一种简单的方法可以做到这一点,但我可能是错的,这就是我要问的原因.
使用gcov,是否可以合并到.gcda文件?之前被问到,解决方案是转换为lcov .info文件并以这种方式合并.如果可能的话,我希望合并操作的输出仍然是单个.gcda文件,这样我就不会被迫使用lcov.
我在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没有希望,你能告诉我如何将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)我想从我的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) 因此,Xcode 7中的热门新功能是集成在XCode中的代码覆盖 - yaaay!这一新功能也带来了Apple的新代码覆盖格式.profdata.
我们需要在Cobertura报告中显示代码覆盖率报告(在Jenkins中加载).目前没有办法转换.profdata为Cobertura XML报告(但它正在路上).
在那之前,我们需要依靠"旧"的gcov.由于某些未知原因,XCode 7生成.gcno和.gcda,但是当您gcovr创建Cobertura报告时,它显示所有文件的0%覆盖率(我们肯定有一些覆盖率).
我们试图回到XCode 6.4,生成的gcov文件在运行时显示正确的覆盖范围gcovr.
有人遇到过同样的问题吗?任何可能的解决方
我遇到了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 --combine和lcov --remove步骤非常缓慢的为好.每个人大约45秒.
有没有办法加快这个组合步骤?如果需要我可以使用几个线程,我有足够的内存.如果有其他工具能够正确地进行这种组合,我也会感兴趣(我已经尝试将文件转换为Cobertura并使用我发现的Python脚本进行合并,但它崩溃了).
如果完全有替代lcov,我也很感兴趣.我一直在使用gcovr,但有了它,我必须使用其他几种工具来进行组合并且它不是最佳的,但速度要快得多.
在C++代码中查找未实例化模板的最佳方法是什么?
我有一个大量使用模板的代码库.当然,我们希望确保测试覆盖率很高.对于所有使用的代码,这非常有效gcov.
但是,未使用的模板将报告为不可执行的gcov.
经过一些谷歌搜索,似乎没有办法强制g++发出这些模板的代码(这只是逻辑,编译器应该如何猜测任何类型?)似乎也没有办法让gcov识别未实例化的模板代码作为可运行的代码.
有没有"开箱即用"的东西可以让我增加GCC -ftest-coverage -fprofile-arcs仪器生成的文件?通过GCC的gcov选项文档,将整个模板函数体标记为一个块可能就足够了,因为执行永远不会在那里结束.
编辑(背景信息):我正在开发一个仅限标题的模板库.我的目标是找到未使用/未经测试的功能.
我知道代码覆盖是有缺陷的,但找到未经实例化的代码是迈向更好测试代码的非常重要的一步.目前,我们将检查点宏放在每个函数的开头.在测试模式中,它们扩展为将一对(file, line)插入全局传递检查点的代码.运行测试后,我们手动读取所有文件,并将到达的检查点与所有可用检查点的集合进行比较.
查找未实例化的代码很重要,例如,由于不直观的C++模板优先级行为,可能存在读者甚至作者期望使用的死代码.
我需要gcov在我正在处理的共享库上执行一些测试覆盖.
问题是libtool将目标文件重命名为my-name.c,libmylib_la-my-name.lo并且gcov无法处理该转换.每次运行它时,cannot open notes file都会生成错误.
如果我手动重命名my-name.c到libmylib_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理解文件名修改方案?