打桩、断言、代码覆盖之间关系之单元测试

Gcc在编译阶段指定 –ftest-coverage 等覆盖率测试选项后,GCC会:

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

2、 在源代码中每行可执行语句生成的代码之后附加一段更新覆盖率统计结果的代码,也就是插桩(后面详细介绍);

3、 Gcc编译,会生成*.gcno文件,它包含重建基本块图和相应块的源码的行号信息;

4、 在最终可执行文件中,进入main函数之前调用gcov_init内部函数初始化统计数据区,并将gcov_init内部函数注册为exit_handers,用户代码调用exit正常结束时,gcov_exit函数得到调用,并继续调用__gcov_flush输出统计数据到*.gcda文件。
 

插桩

在保证被测程序原有逻辑完整性的基础上在程序中插入一些探针,以获得程序控制流和数据流。

gcov是使用基本块BB和跳转ARC计数。

基本块(basic block)是一段线性的代码,只能从这段代码开始处进入这段代码,没有其他代码会跳跃进入这段代码,只能从这段代码最后一行离开这段代码,中间没有其他代码会跳跃离开这段代码。

跳转ARC:从一个BB跳转到另一个BB。

如果把BB看作是一个节点,那么整个程序构成了有向图。要想知道程序中每个语句和分支的执行次数,就必须知道每个BB和ARC的执行次数。

插桩过程

1.GCC在插桩的过程中会向源文件末尾插入一个静态数组BX2.数组的大小就是这个源文件中桩点的个数。BX2+n表示第n个桩点的位置,数组元素的值就是桩点的执行次数。

2.每个桩点插入汇编语句:inc$(BX2+n)

3.BX2数组链表:为了方便统计,gcc还将各个源文件中的BX2数组连成一个链表,它在main函数之前就有一个类似于构造函数的__attribute__((constructor)) void before();会构建链表。这个函数在推出时调用exit函数计算执行次数生成.gcda文件。

生成文件

gcov 使用两个文件进行分析。这些文件的名称是通过将文件后缀替换为 .gcno 或 .gcda 来从原始目标文件派生的。这些文件包含以独立于平台的格式存储的覆盖率和剖面数据。 .gcno 文件与目标文件放置在同一目录中。默认情况下,.gcda 文件也存储在与目标文件相同的目录中,但可以使用 GCC -fprofile-dir 选项将 .gcda 文件存储在单独的目录中。

使用 GCC -ftest-coverage 选项编译源文件时会生成 .gcno 注释文件。它包含重建基本块图和为块分配源行号的信息。

执行包含使用 GCC -fprofile-arcs 选项构建的目标文件的程序时,会生成 .gcda 计数数据文件。为使用此选项编译的每个目标文件创建一个单独的 .gcda 文件。它包含弧过渡计数、值配置文件计数和一些摘要信息。

行动吧,在路上总比一直观望的要好,未来的你肯定会感 谢现在拼搏的自己!如果想学习提升找不到资料,没人答疑解惑时,请及时加入扣群:,里面有各种软件测试+开发资料和技术可以一起交流学习哦。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值