考虑以下命令:
gcc -fprofile-arcs -ftest-coverage main.c
它生成文件 main.gcda,gcov 将使用该文件来生成覆盖率分析。
那么main.gcda是如何生成的呢?仪器仪表是如何完成的?我可以看到检测代码吗?
.gcda不是由编译器生成的;它是由您的程序在执行时生成的。
.gcno 是编译时生成的文件,它是“注释文件”。 gcc 为每个 CU(编译器单元)生成一个基本的框图注释文件 (.gcno)。
那么main.gcda是如何生成的呢?
在运行时,统计数据被收集并存储在内存中。一些退出回调被注册,并在程序终止时被调用以将数据写入 .gcda 文件。这意味着如果您在程序中调用 abort() 而不是 exit(),则不会生成 .gcda 文件。
仪器仪表是如何完成的?我可以看到检测代码吗?
您需要检查 gcc 的实现来获取详细信息,但基本上,检测是通过向程序插入指令来计算每条指令执行的次数来完成的。但它实际上并不需要为每条指令保留一个计数器; GCC 使用某种算法生成程序流程图并为该图找到生成树。只需要检测一些特殊的弧,即可生成所有代码分支的覆盖范围。
您可以反汇编二进制文件以查看检测的代码。
如果您想查看 gcc 源文件,这里有一些可供覆盖的文件:
托普莱夫.c
覆盖率.c
配置文件.c
libgcov.c
冠状病毒变种c
gcov-io.c
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)