考虑以下命令:
gcc -fprofile-arcs -ftest-coverage main.c
它生成文件main.gcda,供gcov使用以生成覆盖率分析报告。 那么如何生成main.gcda?如何进行插桩?我能看到插桩后的代码吗?
考虑以下命令:
gcc -fprofile-arcs -ftest-coverage main.c
.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
我能看到插装代码吗?
您无法查看像gcda文件这样的插装数据。
Gcov是如何工作的?
Gcov分为四个阶段:
1.编译期间的代码插桩
2.代码执行期间的数据收集
3.程序退出时的数据提取
4.死后覆盖分析和呈现。
要了解有关各个步骤的更多信息,可以查看此pdf。
http://ltp.sourceforge.net/documentation/technical_papers/gcov-ols2003.pdf