1

我想使用 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 的源代码从它获取所需信息的经验,它没有提供?

4

1 回答 1

1

简单地重写 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 工具处理。

于 2013-01-09T14:02:40.057 回答