gcov代码覆盖率实现逻辑:

使用gcov分析器,可以找到一些基本的性能统计数据:
每一行代码执行的频率是多少
实际执行了哪些行代码,配合测试用例达到满意的覆盖率和预期工作
每段代码使用了多少计算时间,从而找到热点优化代码
gcov创建一个sourcefile.gcov的日志文件,此文件标识源文件sourcefile.c每一行执行的次数。

注意:gcov只在使用GCC编译的代码上工作。它与任何其他概要或测试覆盖机制不兼容。

过程:
使用gcov实现代码覆盖率,通过lcov等前端工具实现统计数据图形化。

编译时,必须添加编译器参数-fprofile-arcs -ftest-coverage才能开启gcov功能,在生成汇编文件的阶段完成插桩,每个桩点插入3~4条汇编语句,直接插入生成的*.s文件中,最后汇编文件汇编生成目标文件,生成可执行文件;并且生成关联BB(基本块)和ARC(狐跳转)的.gcno文件;

-ftest-coverage:在编译的时候产生.gcno文件,它包含了重建基本块图和相应的块的源码的行号的信息。
-fprofile-arcs:在运行编译过的程序的时候,会产生.gcda文件,它包含了弧跳变的次数等信息。

编译时,生成所有源文件对应的.gcno文件。只要源码不变,生成的.o不变,gcno就不变。但gcno会记录一个关于编译时的时间戳。

运行生成的可执行程序,就会生成.gcda文件。gcda文件包含了bb和狐跳变统计次数。

执行gcov + 源文件 产生.c.gcov的代码覆盖率数据。

其中##表示未运行的行

每行前面的数据表示行运行的次数。

.c.gcov可用vim打开,可视化程度较低,借助lcov和genhtml工具直接生成html报告。

lcov -c(–capture) -d(–directory) . -o(–output-file) helloworld_gcov.info --gcov-tool /usr/bin/gcov

lcov -r(–remove) helloworld_gcov.info ‘/include/’ ‘/libusb/’ '/tests/’ '/4.9.4/*’ -o result.info

-c表示要获取覆盖率数据

-d表示gcno和gcda所在目录。

-o 指定输出文件名字。

-r 表示移除指定目录的统计覆盖率信息(第三方库等)

–gcov-tool表示指定gcov版本。(如果无法生成info文件时使用)

根据.info文件在指定目录中生成覆盖率文件。

genhtml result.info --output-dir ut_coverage

gcov原理分析

gcc编译时,指定-ftest-coverage选项后,gcc会:

  1. 在输出目标文件中留出一段存储区保存统计数据

  2. 编译时,在源代码中的每行语句之后附加一段记录覆盖率统计结果的代码,也就是前文说的插桩。

  3. 执行可执行程序之前调用内部函数gcov_init初始化统计数据区,将gcov_exit 注册为 exit handlers,一旦可执行程序调用exit正常结束时,gcov_exit 函数得到调用,其继续调用 __gcov_flush 函数输出统计数据到 *.gcda 文件中。(如果可执行程序非正常退出,则无法得到统计结果)

内存监控覆盖率:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值