GCC Coverage代码分析-GCC插桩基本概念及原理分析
2011-05-27 09:30
651 查看
本博客(http://blog.csdn.net/livelylittlefish)贴出作者(阿波)相关研究、学习内容所做的笔记,欢迎广大朋友指正!
Content
1. 序
2. GCC插桩原理
2.1 GCC编译插桩的过程
2.2 GCC在何处插桩
2.3 GCC如何才能在编译的同时插桩
3. 小结
1.序
在"Linux平台代码覆盖率测试-GCC插桩前后汇编代码对比分析"一文,我们已经分析了GCC插桩前后汇编代码的变化,对GCC插入的桩代码有比较全面的了解。本文将简单叙述GCC插桩的基本概念和原理。
2. GCC插桩原理
2.1 GCC编译插桩的过程
GCC的插桩和编译过程如下图。
过程描述:
(1)编译预处理程序对源文件进行预处理,生成预处理文件(.i文件)
(2)编译插桩程序对.i文件进行编译,生成汇编文件(.s文件),同时完成插桩
(3)汇编程序对.s文件进行汇编,生成目标文件(.o文件)
(4)链接程序对.o文件进行连接,生成可执行文件(.out/.elf文件)
因此,插桩是汇编一级的插桩,每个桩点插入6条汇编语句,直接插入.s文件中。在程序执行的过程中,这些桩代码负责收集程序的执行信息。桩代码及其分析请参考"Linux平台代码覆盖率测试-GCC插桩前后汇编代码对比分析"一文。
2.2 GCC在何处插桩
GCC对部分arc插桩,为什么?
从arc的执行次数可以很容易的计算出每个BB的执行次数,而从BB的执行次数推算出每个arc的执行次数的困难的;
也没有必要对每个arc都插桩,只需要知道图中部分关键arc的执行次数就可以计算出所有BB和arc的执行次数。桩的数量只要保证能够计算出所有BB和arc的执行次数的最低限度即可。
2.3 GCC如何才能在编译的同时插桩
BB和arc都是汇编一级的概念,那么如何才能让GCC在编译的同时插入桩代码呢?
在编译时加入"-ftest-coverage-fprofile-arcs"选项即可。
-ftest-coverage选项会让GCC为每个源文件生成同名的.gcno文件,在gcov程序中,将读取.gcno文件,重组每一个可执行程序的程序流图。
-fprofile-arcs选项会让GCC为每个源文件生成同名的.gcda文件,该文件包含每一个指令分支的执行次数信息。请参考"Linux平台代码覆盖率测试-GCC插桩前后汇编代码对比分析"及前面的文章。
3.小结
本文简单地叙述GCC插桩的基本概念和原理,包括编译插桩过程,插桩点及编译(插桩)选项。
Reference
费训,罗蕾.利用GNU工具实现汇编程序覆盖测试,计算机应用,
24卷, 2004.
吴康.面向多语言混合编程的嵌入式测试软件设计与实现(硕士论文).电子科技大学,
2007.
http://blog.csdn.net/livelylittlefish/archive/2011/05/27/6448906.aspx
http://blog.csdn.net/livelylittlefish/archive/2011/05/26/6448799.aspx
http://blog.csdn.net/livelylittlefish/archive/2011/05/01/6382489.aspx
http://blog.csdn.net/livelylittlefish/archive/2011/04/13/6321909.aspx
http://blog.csdn.net/livelylittlefish/archive/2011/05/27/6448885.aspx
http://blog.csdn.net/livelylittlefish/archive/2011/05/27/6448867.aspx
Technorati 标签:
覆盖率测试,GCC,gcov,gcov-dump
Content
1. 序
2. GCC插桩原理
2.1 GCC编译插桩的过程
2.2 GCC在何处插桩
2.3 GCC如何才能在编译的同时插桩
3. 小结
1.序
在"Linux平台代码覆盖率测试-GCC插桩前后汇编代码对比分析"一文,我们已经分析了GCC插桩前后汇编代码的变化,对GCC插入的桩代码有比较全面的了解。本文将简单叙述GCC插桩的基本概念和原理。
2. GCC插桩原理
2.1 GCC编译插桩的过程
GCC的插桩和编译过程如下图。
过程描述:
(1)编译预处理程序对源文件进行预处理,生成预处理文件(.i文件)
(2)编译插桩程序对.i文件进行编译,生成汇编文件(.s文件),同时完成插桩
(3)汇编程序对.s文件进行汇编,生成目标文件(.o文件)
(4)链接程序对.o文件进行连接,生成可执行文件(.out/.elf文件)
因此,插桩是汇编一级的插桩,每个桩点插入6条汇编语句,直接插入.s文件中。在程序执行的过程中,这些桩代码负责收集程序的执行信息。桩代码及其分析请参考"Linux平台代码覆盖率测试-GCC插桩前后汇编代码对比分析"一文。
2.2 GCC在何处插桩
GCC对部分arc插桩,为什么?
从arc的执行次数可以很容易的计算出每个BB的执行次数,而从BB的执行次数推算出每个arc的执行次数的困难的;
也没有必要对每个arc都插桩,只需要知道图中部分关键arc的执行次数就可以计算出所有BB和arc的执行次数。桩的数量只要保证能够计算出所有BB和arc的执行次数的最低限度即可。
2.3 GCC如何才能在编译的同时插桩
BB和arc都是汇编一级的概念,那么如何才能让GCC在编译的同时插入桩代码呢?
在编译时加入"-ftest-coverage-fprofile-arcs"选项即可。
-ftest-coverage选项会让GCC为每个源文件生成同名的.gcno文件,在gcov程序中,将读取.gcno文件,重组每一个可执行程序的程序流图。
-fprofile-arcs选项会让GCC为每个源文件生成同名的.gcda文件,该文件包含每一个指令分支的执行次数信息。请参考"Linux平台代码覆盖率测试-GCC插桩前后汇编代码对比分析"及前面的文章。
3.小结
本文简单地叙述GCC插桩的基本概念和原理,包括编译插桩过程,插桩点及编译(插桩)选项。
Reference
费训,罗蕾.利用GNU工具实现汇编程序覆盖测试,计算机应用,
24卷, 2004.
吴康.面向多语言混合编程的嵌入式测试软件设计与实现(硕士论文).电子科技大学,
2007.
http://blog.csdn.net/livelylittlefish/archive/2011/05/27/6448906.aspx
http://blog.csdn.net/livelylittlefish/archive/2011/05/26/6448799.aspx
http://blog.csdn.net/livelylittlefish/archive/2011/05/01/6382489.aspx
http://blog.csdn.net/livelylittlefish/archive/2011/04/13/6321909.aspx
http://blog.csdn.net/livelylittlefish/archive/2011/05/27/6448885.aspx
http://blog.csdn.net/livelylittlefish/archive/2011/05/27/6448867.aspx
Technorati 标签:
覆盖率测试,GCC,gcov,gcov-dump
相关文章推荐
- SharpDevelop代码分析 (一、序+基本概念)
- ION基本概念介绍和原理分析
- 蓝牙协议分析_基本概念及Android4.4 BT代码架构
- ION基本概念介绍和原理分析
- ION基本概念介绍和原理分析
- ION基本概念介绍和原理分析
- SharpDevelop代码分析 (一、序+基本概念)
- SpringBoot系列三:SpringBoot基本概念(统一父 pom 管理、SpringBoot 代码测试、启动注解分析、配置访问路径、使用内置对象、项目打包发布)
- HDFS原理分析:基本概念
- ION基本概念介绍和原理分析
- HDFS原理分析:基本概念
- ION基本概念介绍和原理分析
- SharpDevelop代码分析 (一、序+基本概念)
- SharpDevelop代码分析 (一、序+基本概念)
- 编译原理:文法与语法分析基本概念
- osworkflow基础入门部分汇总(基本概念,包用途分析及代码片断,表结构分析,主要优势,核心概念)
- ION基本概念介绍和原理分析
- GCC Coverage代码分析-gcov-dump原理分析
- ION基本概念介绍和原理分析
- SharpDevelop代码分析 (一、序+基本概念)