首页 > *nix技术, 跟踪调试 > gcov初试用

gcov初试用

2012年8月24日 发表评论 阅读评论 855 次浏览

gcov是标准的GNU覆盖测量工具,这里就尝试试用一下。有如下这么一个源文件:

/**
 * gcc -fprofile-arcs -ftest-coverage tmp.c
 */
#include <stdio.h>

int main(int argc, char **argv)
{
    int i, total;
    total = 0;

    for (i = 0; i < 10; i++)
        total += i;

    if (total != 45)
        printf ("Failure\n");
    else
        printf ("Success\n");

    return 0;
}

按照源文件里的注释提示编译它:

[root@localhost gcov]# cat /etc/issue
CentOS Linux release 6.0 (Final)
Kernel \r on an \m

[root@localhost gcov]# ls
tmp.c
[root@localhost gcov]# gcc -fprofile-arcs -ftest-coverage tmp.c
[root@localhost gcov]# ls -a
.  ..  a.out  tmp.c  tmp.gcno
[root@localhost gcov]#

除了编译链接得到可执行程序a.out外,还生成了一个tmp.gcno的文件,执行a.out后,又将生成tmp.gcda:

[root@localhost gcov]# ./a.out
Success
[root@localhost gcov]# ls -a
.  ..  a.out  tmp.c  tmp.gcda  tmp.gcno

再使用gcov执行命令”gcov tmp.c”,得到tmp.c.gcov,cat看看其内容:

[root@localhost gcov]# gcov tmp.c
File 'tmp.c'
Lines executed:87.50% of 8
tmp.c:creating 'tmp.c.gcov'

[root@localhost gcov]# cat tmp.c.gcov
        -:    0:Source:tmp.c
        -:    0:Graph:tmp.gcno
        -:    0:Data:tmp.gcda
        -:    0:Runs:1
        -:    0:Programs:1
        -:    1:/**
        -:    2: * gcc -fprofile-arcs -ftest-coverage tmp.c
        -:    3: */
        -:    4:#include <stdio.h>
        -:    5:
        1:    6:int main(int argc, char **argv)
        -:    7:{
        -:    8:    int i, total;
        1:    9:    total = 0;
        -:   10:
       11:   11:    for (i = 0; i < 10; i++)
       10:   12:        total += i;
        -:   13:
        1:   14:    if (total != 45)
    #####:   15:        printf ("Failure\n");
        -:   16:    else
        1:   17:        printf ("Success\n");
        -:   18:
        1:   19:    return 0;
        -:   20:}
        -:   21:
[root@localhost gcov]#

第一列里的数字就表示该行代码被执行到的次数,比如:
第11行显示的11表示代码“for (i = 0; i < 10; i++)”被执行了11次。
第12行显示的10表示代码“total += i;”被执行了10次。
打井号的表示该行代码没执行到。

可以通过gcov的-a选项显示更详细的信息,看示例:

[root@localhost gcov]# gcov -a tmp.c
File ‘tmp.c’
Lines executed:87.50% of 8
tmp.c:creating ‘tmp.c.gcov’

[root@localhost gcov]# cat tmp.c.gcov
        -:    0:Source:tmp.c
        -:    0:Graph:tmp.gcno
        -:    0:Data:tmp.gcda
        -:    0:Runs:1
        -:    0:Programs:1
        -:    1:/**
        -:    2: * gcc -fprofile-arcs -ftest-coverage tmp.c
        -:    3: */
        -:    4:#include <stdio.h>
        -:    5:
        1:    6:int main(int argc, char **argv)
        -:    7:{
        -:    8:    int i, total;
        1:    9:    total = 0;
        -:   10:
       11:   11:    for (i = 0; i < 10; i++)
        1:   11-block  0
       10:   11-block  1
       11:   11-block  2
       10:   12:        total += i;
        -:   13:
        1:   14:    if (total != 45)
        1:   14-block  0
    #####:   15:        printf ("Failure\n");
    $$$$$:   15-block  0
        -:   16:    else
        1:   17:        printf ("Success\n");
        1:   17-block  0
        -:   18:
        1:   19:    return 0;
        1:   19-block  0
        -:   20:}
        -:   21:
[root@localhost gcov]#

这样,第11行代码分为3块分别计数表示,块0“i = 0; ”执行1次,块1“i < 10; ”执行10次,而块1“i++”执行11次。

完全参考:http://gcc.gnu.org/onlinedocs/gcc/Invoking-Gcov.html#Invoking-Gcov

转载请保留地址:http://lenky.info/archives/2012/08/24/1884http://lenky.info/?p=1884


备注:如无特殊说明,文章内容均出自Lenky个人的真实理解而并非存心妄自揣测来故意愚人耳目。由于个人水平有限,虽力求内容正确无误,但仍然难免出错,请勿见怪,如果可以则请留言告之,并欢迎来讨论。另外值得说明的是,Lenky的部分文章以及部分内容参考借鉴了网络上各位网友的热心分享,特别是一些带有完全参考的文章,其后附带的链接内容也许更直接、更丰富,而我只是做了一下归纳&转述,在此也一并表示感谢。关于本站的所有技术文章,欢迎转载,但请遵从CC创作共享协议,而一些私人性质较强的心情随笔,建议不要转载。

法律:根据最新颁布的《信息网络传播权保护条例》,如果您认为本文章的任何内容侵犯了您的权利,请以或书面等方式告知,本站将及时删除相关内容或链接。

  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.