【发布时间】:2013-11-04 03:32:54
【问题描述】:
考虑以下命令:
gcc -fprofile-arcs -ftest-coverage main.c
它会生成文件 main.gcda,供 gcov 使用,以生成覆盖率分析。 那么main.gcda是如何生成的呢?仪表是怎么做的?我可以看到检测的代码吗?
【问题讨论】:
标签: c gcc code-coverage gcov
考虑以下命令:
gcc -fprofile-arcs -ftest-coverage main.c
它会生成文件 main.gcda,供 gcov 使用,以生成覆盖率分析。 那么main.gcda是如何生成的呢?仪表是怎么做的?我可以看到检测的代码吗?
【问题讨论】:
标签: c gcc code-coverage gcov
Can I see the instrumented code?
您看不到 gcda 文件等检测数据。
Gcov 是如何工作的?
GCOV 分四个阶段工作:
1. Code instrumentation during compilation
2. Data collection during code execution
3. Data extraction at program exit time
4. Coverage analysis and presentation post-mortem.
要了解有关各个步骤的更多信息,您可以阅读此 pdf。
http://ltp.sourceforge.net/documentation/technical_papers/gcov-ols2003.pdf
【讨论】:
.gcda 不是编译器生成的;它是由您的程序在您执行时生成的。
.gcno 是编译时生成的文件,它是“注释文件”。 gcc 为每个 CU(编译器单元)生成一个基本的块图注释文件(.gcno)。
那么main.gcda是如何生成的呢?
在运行时,统计数据被收集并存储在内存中。某些退出回调已注册,并在程序终止时被调用以将数据写入 .gcda 文件。这意味着如果您在程序中调用 abort() 而不是 exit(),则不会生成 .gcda 文件。
仪器是如何完成的?我可以看到检测的代码吗?
您需要检查 gcc 的实现以获取详细信息,但基本上检测是通过向程序中插入指令来计算每条指令的执行次数来完成的。但它并不一定要为每条指令保留一个计数器。 GCC 使用某种算法来生成程序流图并为该图找到一个生成树。只需要检测一些特殊的弧,并且可以从中生成所有代码分支的覆盖范围。 您可以反汇编二进制文件以查看检测代码。 如果您想查看 gcc 源文件,这里有一些文件可供参考:
toplev.c 覆盖率.c 个人资料.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
【讨论】: