GCC的代码覆盖率选项是如何工作的?

8

考虑以下命令:

gcc -fprofile-arcs -ftest-coverage main.c

它生成文件main.gcda,供gcov使用以生成覆盖率分析报告。 那么如何生成main.gcda?如何进行插桩?我能看到插桩后的代码吗?
3个回答

16

.gcda文件不是由编译器生成的,而是在程序执行时由程序生成。

.gcno文件是编译时生成的“注释文件”。GCC为每个编译单元生成一个基本块图注释文件(.gcno)。

那么main.gcda文件是如何生成的呢?

在运行时,统计数据被收集并存储在内存中。一些退出回调被注册,并在程序终止时调用以将数据写入.gcda文件。这意味着如果您在程序中调用abort()而不是exit(),则不会生成.gcda文件。

仪表化是如何完成的?我能否看到仪表化代码?

您需要检查GCC的实现以获取详细信息,但基本上是通过向程序中插入指令来完成仪表化,以计算每条指令被执行的次数。但它并不真正必须为每个指令保留一个计数器;GCC使用某些算法生成程序流图并找到图的生成树。只需对其中一些特殊弧进行仪表化,即可生成所有代码分支的覆盖率。 您可以反汇编二进制文件以查看仪表化代码。 如果您想查看gcc源文件,请参考以下文件:

toplev.c coverage.c profile.c libgcov.c gcov.c gcov-io.c

编辑:以下是一些已知的gcov漏洞,供您参考:

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49484

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=28441

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44779

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=7970


谢谢!你是如何跟踪那些文件的覆盖率的? - Karthik
1
我曾经使用过gcov并遇到了一些问题,所以不得不研究它的实现。我添加了一些已知的错误信息,但它们可能在最近的gcc中得到解决。 - tristan

5

我能看到插装代码吗?

您无法查看像gcda文件这样的插装数据。

Gcov是如何工作的?

Gcov分为四个阶段:

1.编译期间的代码插桩

2.代码执行期间的数据收集

3.程序退出时的数据提取

4.死后覆盖分析和呈现。

要了解有关各个步骤的更多信息,可以查看此pdf。

http://ltp.sourceforge.net/documentation/technical_papers/gcov-ols2003.pdf


0
您可以查看在编译时可执行文件或obj文件中哪些代码与gcov相关联的仪器化,以下是使用的步骤。
nm executable/objfile

以下是附带步骤和输出的图片:-

gcov instrumented code steps


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接