覆盖gcov函数以获得执行的代码行

我想要使​​用gcov获取所有已执行的项目代码行。 例如代码如下所示:

int main()
{
   int i=0;
   for(i=0;i<3;i++)printf("Hello");
   return 0;
}

结果将如下所示:

1)int i=0;
2)for(i=0;i<3;i++)
3)printf("Hello");
4)for(i=0;i<3;i++)
5)printf("Hello");
6)for(i=0;i<3;i++)
7)printf("Hello");
8)for(i=0;i<3;i++)
9)return 0;

主要想法是通过重写libgcov来自己实现gcov函数。 之后,将它与gcc -fprofile-arcs -ftest-coverage test.c -o test -lanothergcov组合使用

那么,做这样的事情是对的还是行不通的,也没有任何人有任何使用gcov源代码的经验来获取它所需要的信息,它没有提供?


简单地重写libgcov是不可能的。 你必须重写相应的gcc代码,在每行之间插入计数器增量指令。

使用仪器后,您的代码将执行如下操作:

 crt0: 
     __gcov_init(main_locals);
     main();
     __gcov_exit(); // dump the counters to files

 int main() {
     static GcovStruct_t local;
     local.Counter[0]++;
     for (i=0;i<3;i++) {
     local.Counter[1]++;
     printf("Hello");
     local.Counter[2]++;
     }
     local.Counter[3]++;
 }

可能有些事情可以做,但你可以使用
<prompt> gcc -S -fprofile-arcs -ftest-coverage获取中间.s文件:

    movq    .LPBX1(%rip), %rax
    addq    $1, %rax
    movq    %rax, .LPBX1(%rip)

这可能几乎微不足道,通过搜索和替换进行修改:

    movq    .LPBX1(%rip), %rax   -> leaq    .LPBX1(%rip), %rax
    addq     $1, %rax            -> pushq %rax
                                    call     __init_add_line_number_to_list
    movq    %rax, .LPBX1(%rip)   -> -- remove this --

然后,您需要新引入的例程来增加qword指针,并将该地址插入一些额外的结构中,这些结构将由您接下来要修改的gcov工具处理。

链接地址: http://www.djcxy.com/p/37967.html

上一篇: Override gcov functions to get executed code lines

下一篇: What's the best C++ code coverage tool that works with templates?