GCC的代码覆盖选项如何工作?
请考虑以下命令:
gcc -fprofile-arcs -ftest-coverage main.c
它生成要由gcov使用的文件main.gcda,以生成覆盖率分析。 那么main.gcda是如何生成的? 仪器如何完成? 我可以看到检测代码吗?
.gcda不是由编译器生成的; 它是由程序在执行时生成的。
.gcno是在编译时生成的文件,它是“注释文件”。 gcc为每个CU(编译器单元)生成基本的块图注释文件(.gcno)。
那么main.gcda是如何生成的?
在运行时,统计数据被收集并存储在存储器中。 注册了一些退出回调,并在程序终止时调用该数据将数据写入.gcda文件。 这意味着如果在程序中调用abort()而不是exit(),则不会生成.gcda文件。
仪器如何完成? 我可以看到检测代码吗?
您需要检查gcc的实现以获取详细信息,但基本上通过向程序插入指令来计算每条指令的执行次数来完成检测。 但它并不一定要为每条指令保留一个计数器; GCC使用一些算法生成程序流图并查找图的生成树。 只需要对一些特殊的弧进行检测,并从中生成所有代码分支的覆盖范围。 您可以反汇编二进制文件以查看已检测的代码。 如果你想查看gcc源文件,这里有一些覆盖文件:
toplev.c coverage.c profile.c libgcov.c gcov.c gcov-io.c
编辑:一些已知的gcov错误FYI:
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49484
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=28441
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
您可以在编译时执行可执行文件或obj文件中查看与gcov相关的代码,您可以使用以下步骤。
nm executable/objfile
以下是附加步骤和输出的图像: –