gpt4 book ai didi

c - 覆盖 gcov 函数以获取已执行的代码行

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:05:23 26 4
gpt4 key购买 nike

我想使用 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 代码,在每一行之间注入(inject)计数器递增指令。

检测后,您的代码基本上将执行为:

 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 工具处理。

关于c - 覆盖 gcov 函数以获取已执行的代码行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14234975/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com