我正在尝试使用gcov编译一个简单的应用程序并获得以下链接错误:
gcc AllTests.o CuTestTest.o CuTest.o -o TestTest
AllTests.o: In function `global constructors keyed to 0_RunAllTests':
/home/p7539c/cutest/AllTests.c:26: undefined reference to `__gcov_init'
AllTests.o:(.data+0x44): undefined reference to `__gcov_merge_add'
CuTestTest.o: In function `global constructors keyed to 0_TestCuStringNew':
/home/p7539c/cutest/CuTestTest.c:30: undefined reference to `__gcov_init'
CuTestTest.o:(.data+0x64): undefined reference to `__gcov_merge_add'
CuTest.o: In function `global constructors keyed to 0_CuStrAlloc':
/home/p7539c/cutest/CuTest.c:379: undefined reference to `__gcov_init'
CuTest.o:(.data+0x184): undefined reference to `__gcov_merge_add'
collect2: ld returned 1 exit status
make: *** [TestTest] Error 1
Run Code Online (Sandbox Code Playgroud)
我似乎找不到丢失符号的位置.gcov存在于运行gcc 4.1.2版的机器上
有任何想法吗?谢谢.
在编辑:
将gcov与包含一个.c文件的应用程序一起使用时,一切似乎都能正常工作.当我有多个.c文件(因此有多个.o文件)时,我遇到了上述问题.
编译步骤如下所示:
cc -fprofile-arcs …Run Code Online (Sandbox Code Playgroud) 我正在使用gcov测量我的C++代码中的覆盖率.我希望得到100%的覆盖率,但是由于存在一些理论上无法触及的代码行(需要实现但从未调用过的方法,switch语句的默认分支等等)而受到阻碍).这些分支中的每一个都包含一个assert( false );语句,但是gcov仍然将它们标记为未命中.
我希望能够告诉gcov忽略这些分支.有没有办法给gcov这些信息 - 通过注释源代码或任何其他机制?
当我使用gcov来测量C++代码的测试覆盖率时,它会在析构函数中报告分支.
struct Foo
{
virtual ~Foo()
{
}
};
int main (int argc, char* argv[])
{
Foo f;
}
Run Code Online (Sandbox Code Playgroud)
当我运行gcov并启用分支概率(-b)时,我得到以下输出.
$ gcov /home/epronk/src/lcov-1.9/example/example.gcda -o /home/epronk/src/lcov-1.9/example -b
File 'example.cpp'
Lines executed:100.00% of 6
Branches executed:100.00% of 2
Taken at least once:50.00% of 2
Calls executed:40.00% of 5
example.cpp:creating 'example.cpp.gcov'
Run Code Online (Sandbox Code Playgroud)
困扰我的部分是"至少采取一次:50%的2".
生成的.gcov文件提供了更多详细信息.
$ cat example.cpp.gcov | c++filt
-: 0:Source:example.cpp
-: 0:Graph:/home/epronk/src/lcov-1.9/example/example.gcno
-: 0:Data:/home/epronk/src/lcov-1.9/example/example.gcda
-: 0:Runs:1
-: 0:Programs:1
-: 1:struct Foo
function Foo::Foo() called 1 returned 100% blocks executed 100%
1: 2:{
function …Run Code Online (Sandbox Code Playgroud) 我现在正在进行C代码覆盖率研究并遇到以下问题,GCC版本4.4.6:
CFLAGS = --coverage和链接器选项LDFLAGS := --coverage或LOCAL_LDLIBS := --coverage得到错误:undefined reference to '__gcov_init'" and "undefined reference to '__gcov_merge_add'
LOCAL_LDFLAGS := --coverage,并收到链接错误:libgcov.a(_gcov.o): in function __gcov_set_sampling_rate: undefined reference to '__gcov_sampling_rate'
libgcov.a(_gcov.o): in function gcov_exit: undefined reference to '__gcov_pmu_profile_filename'
libgcov.a(_gcov.o): in function __gcov_init: undefined reference to '__gcov_pmu_profile_options' '__gcov_pmu_top_n_address'
有人可以帮忙就这个问题提供一些建议吗?
是否可以通过运行链接到使用--coverage选项构建的共享库的可执行文件来生成gcov数据文件(.gcda文件)?
基本上,我有一个主库,它由多个编译成一个共享库的c ++文件组成,然后是一个名为"test"的子目录,其中包含一个链接到并测试主库的测试程序.一切都编译好,并为库源文件和测试源文件生成.gcno文件..gcda文件只为测试源文件生成,但我真的需要它们用于编译到共享库中的实际源文件.
有任何想法吗?
附加信息:
- 这是所有C++代码
- 一切都是使用由automake生成的make脚本构建的
- 在共享库中
为lib_la_CPPFLAGS和lib_la_LDFLAGS指定了--coverage选项Makefile.am - 为AM_CPPFLAGS和AM_LDFLAGS指定了--coverage选项在测试可执行文件Makefile.am中
- 测试源文件使用Google Test(C++单元测试框架)
编辑:固定间距问题
我最近开始使用lcov来可视化我的代码覆盖率.这是一个很棒的工具.
我注意到的一件事是它为我正在使用的所有文件生成代码覆盖率报告 - 包括那些我不感兴趣的文件.例如,它将为我提供boost和mysql ++文件的代码覆盖率报告.
是否有一种简单的方法可以强制lcov仅生成特定文件的覆盖率报告?
我试过像这样使用-k参数:
/usr/bin/lcov -q -c -i -b . -d .obj -k src/ -k include/ -o app_base.info
{run unit tests now}
/usr/bin/lcov -q -c -b . -d .obj -k src/ -k include/ -o app_test.info
/usr/bin/lcov -q -a app_base.info -a app_test.info -o app_total.info
/usr/bin/genhtml -q -o lcov_output_directory app_total.info
(这意味着我只想要"include"和"src"目录的覆盖文件.)
但是,这似乎不起作用.该报告仍然显示了所有无关的文件.任何建议都非常感谢.谢谢!
今天我的任务是将单元测试覆盖率分析添加到我们的代码库中.今天也是iOS 7.1与XCode 5.1一起发布的日子.从发行说明:
用于代码覆盖测试的gcov工具已重新实现.新版本使用LLVM项目中的llvm-cov工具.对于所有重要功能,它在功能上等同于旧版本.Xcode中gcov的位置也已移动,使用xcrun来调用它.如果您发现问题,请提交错误报告.对于此版本,您仍然可以使用GCC的旧版gcov,它以gcov-4.2的形式提供.11919694已更新
我只是在遵循几篇教学 博客 文章后才意识到这一点,正确设置我的环境 - 在测试时在模拟器的构建文件夹中生成.gcda/.gcno文件 - 并且在此处生成报告生成工具尝试将它们解析为报告.(这是一个./getcov脚本,它收集您的环境变量以传递给lcov-1.10脚本以生成报告)
第一个障碍是新的捆绑gcov程序不支持-v获取版本的参数,这是lcov初始化的第一步.看起来就像一个非首发,但是阅读上面的发行说明我修改了lcov脚本以使用旧gcov-4.2版本并解决了问题.
但是,lcov在处理我的覆盖数据文件时很早就出错了.这会在我的项目中按字母顺序生成一个可能包含前10个文件的报告.不是特别有用.错误输出是最小的,也是无益的:
geninfo:错误:GCOV(build_artifacts)/(class_that_errored).gcda失败了!
我修改了lcov脚本以打印它所获得的错误(11遗憾的是,它只能在gcov(-io).c代码中找不到任何引用)并继续操作而不是退出,所以我留下了更多报告中的文件,但仍有85%的源文件出错,如上所述.
我能够在报告中成功结束的文件与发生错误的文件之间辨别的唯一模式是任何使用内联块声明的文件都失败了.没有任何传递过的文件以任何方式阻止,我检查过的所有文件都包含块.奇怪.
后来我想通了,我可以在打开单个文件.gcda 封面,其中包括曾在出错的那些lcov脚本.在coverage报告下面的消息窗口中,所有出错的文件都有警告消息:
(class_that_errored).gcno:'__copy_helper_block_'没有行
(class_that_errored).gcno:'__destroy_helper_block_'没有行
在这一点上我最好的假设是新的XCode 5.1生成.gcda文件,旧gcov-4.2程序没有配备有关块声明的处理.
但是我已经筋疲力尽了我想要尝试的一切,所以我在这里询问是否有人知道我错过了什么,或者有什么想法可以进一步调试.或者,如果有人成功测量了今天的XCode 5.1更新后的测试覆盖率gcov,我很想知道你必须做出的任何改变.
对于我的仅标题C++库(许多模板等),我使用GCov来检查测试覆盖率.但是,它会报告所有标头的100%覆盖率,因为编译器首先不会生成未使用的函数.手动发现未覆盖的功能很容易,但却无法实现持续集成的目的......
如何自动解决这个问题?我应该使用"line hit/LOC"作为我的覆盖率指标,而且再也不会达到100%吗?
我正在尝试在Xcode 6 Beta 4上为Swift应用程序设置测试代码覆盖率.
过去我使用带有Xcode 5的ObjectiveC来实现这一点,但我认为我必须调用该void __gcov_flush()方法,以触发生成.gcda /.gcno文件.
我YES为应用程序和测试目标设置了检测和代码覆盖的两个属性.
但是在运行测试之后,当我查看:
DerivedData/some子文件夹/ i386我看到的都是类型的文件:
.d,.dia,.o,.swiftmodule等,但没有任何表明代码覆盖率.
因此我有两个问题:
谢谢
在一个项目中,我在三个不同的可执行文件上运行测试用例,使用不同的选项进行编译.根据选项,可以使用或不使用某些代码路径.现在,我只使用一个可执行文件的覆盖数据.
我正在使用gcovr生成一个XML,然后由Sonar解析:
gcovr -x -b -r . --object-directory=debug/test > coverage_report.xml
Run Code Online (Sandbox Code Playgroud)
我有三套gcda和gcno文件,但我不知道如何生成它们的全局报告.
有没有办法做到这一点?