我想使用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的源代码来获取它需要的信息,它没有提供吗?
答案 0 :(得分: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)
通过搜索&amp; amp;修改这几乎是微不足道的。替换为:
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工具处理。