C/C++代码覆盖工具gcov与lcov入门

简介: C/C++代码覆盖工具gcov与lcov入门

C/C++代码覆盖工具gcov与lcov入门


gcov是一个可用于C/C++的代码覆盖工具,是gcc的内建工具。下面介绍一下如何利用gcov来收集代码覆盖信息。

想要用gcov收集代码覆盖信息,需要在gcc编译代码的时候加上这2个选项 “-fprofile-arcs -ftest-coverage”,把这个简单的程序编译一下


gcc -fprofile-arcs -ftest-coverage hello.c -o hello


编译后会得到一个可执行文件hello和hello.gcno文件,当用gcc编译文件的时候,如果带有“-ftest-coverage”参数,就会生成这个.gcno文件,它包含了程序块和行号等信息

接下来可以运行这个hello的程序


./hello 5

./hello 12


运行结束以后会生成一个hello.gcda文件,如果一个可执行文件带有“-fprofile-arcs”参数编译出来,并且运行过至少一次,就会生成。这个文件包含了程序基本块跳转的信息。接下来可以用gcov生成代码覆盖信息:


gcov hello.c


运行结束以后会生成2个文件hello.c.gcov和myfunc.c.gcov。打开看里面的信息:


-: 0:Source:myfunc.c

-: 0:Graph:hello.gcno

-: 0:Data:hello.gcda

-: 0:Runs:1

-: 0:Programs:1

-: 1:#include

-: 2:

-: 3:void test(int count)

1: 4:{

-: 5: int i;

10: 6: for (i = 1; i < count; i++)

-: 7: {

9: 8: if (i % 3 == 0)

3: 9: printf (“%d is divisible by 3 \n”, i);

9: 10: if (i % 11 == 0)

#####: 11: printf (“%d is divisible by 11 \n”, i);

9: 12: if (i % 13 == 0)

#####: 13: printf (“%d is divisible by 13 \n”, i);

-: 14: }

1: 15:}


被标记为#####的代码行就是没有被执行过的,代码覆盖的信息是正确的,但是让人去读这些文字,实在是一个杯具。不用担心,有另外一个工具叫lcov,可以用程序解析这些晦涩的字符,最终输出成html格式的报告,很好吧!


lcov -d . -t ‘Hello test’ -o ‘hello_test.info’ -b . -c


指定lcov在当前目录“.”去找代码覆盖的信息,输出为’hello_test.info’ ,这个hello_test.info是一个中间结果,需要把它用genhtml来处理一下,genhtml是lcov里面的一个工具。


genhtml -o result hello_test.info


指定输出目录是 result。一个完整的html报告就生成了,做一个连接,把这个目录连到随便一个web server的目录下,就可以看报告了。


gcov和lcov基本上能满足测试过程中收集代码覆盖率信息的需求,不过有个遗憾就是gcov不能收集.so文件的代码覆盖信息。

No related posts.

发布于2010年09月12日作者magus分类白盒测试软件测试标签gcovlcov代码覆盖白盒测试软件测试

 

1.risewind说道:


2015年10月11日 16:20
现在已经可以收集so的覆盖率信息了。
回复


2. moon说道:


2015年08月21日 11:11
gcov是非常方便,如果能统计一行的部分执行就好了。
现在还没看到有这样的功能。
比如
if(a==0){a=1;}else{a=2;}
如果只执行到a==0的条件,没执行到else部分,能表示出来部分执行就好了。

目录
相关文章
|
5天前
|
算法 安全 C++
提高C/C++代码的可读性
提高C/C++代码的可读性
19 4
|
1月前
|
编译器 C++
C++入门12——详解多态1
C++入门12——详解多态1
38 2
C++入门12——详解多态1
|
1月前
|
编译器 C语言 C++
C++入门3——类与对象2-2(类的6个默认成员函数)
C++入门3——类与对象2-2(类的6个默认成员函数)
23 3
|
1月前
|
C++
C++入门13——详解多态2
C++入门13——详解多态2
79 1
|
1月前
|
程序员 C语言 C++
C++入门5——C/C++动态内存管理(new与delete)
C++入门5——C/C++动态内存管理(new与delete)
66 1
|
1月前
|
编译器 C语言 C++
C++入门4——类与对象3-1(构造函数的类型转换和友元详解)
C++入门4——类与对象3-1(构造函数的类型转换和友元详解)
19 1
|
1月前
|
Linux C语言 C++
vsCode远程执行c和c++代码并操控linux服务器完整教程
这篇文章提供了一个完整的教程,介绍如何在Visual Studio Code中配置和使用插件来远程执行C和C++代码,并操控Linux服务器,包括安装VSCode、安装插件、配置插件、配置编译工具、升级glibc和编写代码进行调试的步骤。
195 0
vsCode远程执行c和c++代码并操控linux服务器完整教程
|
1月前
|
编译器 C语言 C++
C++入门6——模板(泛型编程、函数模板、类模板)
C++入门6——模板(泛型编程、函数模板、类模板)
41 0
C++入门6——模板(泛型编程、函数模板、类模板)
|
1月前
|
存储 安全 编译器
【C++打怪之路Lv1】-- 入门二级
【C++打怪之路Lv1】-- 入门二级
23 0
|
1月前
|
自然语言处理 编译器 C语言
【C++打怪之路Lv1】-- C++开篇(入门)
【C++打怪之路Lv1】-- C++开篇(入门)
24 0