• [其他] 代码覆盖率检查 gcov 和 lcov


    前言:

    代码覆盖率检查是只在一次程序运行过程中,哪些代码和函数被运行到了,哪些没有被运行到,以此来观察是否又无用代码,同时也能观察哪些代码被频繁运行,进而可以进行针对性的优化。

    gcov 用来生成报告,lcov用来把 gcov 生成的报告做二次加工成,比如做成 html 网页。

    使用gcov生成报告:

    2.c:

    1. void func()
    2. {
    3. 1==1;
    4. }
    5. int main(int argc,char** agrv)
    6. {
    7. int i = 0;
    8. if (1>2){
    9. i++;
    10. }else{
    11. i--;
    12. }
    13. }

    编译:

    gcc -fprofile-arcs -ftest-coverage 2.c -o 2

    运行:

    ./2

    生成报告:

    gcov 2.c

    这个时候会得到一个文件  2.c.gcov ,打开文件就可以看到如下结果:

    1. -: 0:Source:2.c
    2. -: 0:Graph:2.gcno
    3. -: 0:Data:2.gcda
    4. -: 0:Runs:1
    5. -: 0:Programs:1
    6. #####: 1:void func()
    7. -: 2:{
    8. -: 3: 1==1;
    9. #####: 4:}
    10. -: 5:
    11. -: 6:
    12. 1: 7:int main(int argc,char** agrv)
    13. -: 8:{
    14. 1: 9: int i = 0;
    15. -: 10: if (1>2){
    16. -: 11: i++;
    17. -: 12: }else{
    18. 1: 13: i--;
    19. -: 14: }
    20. -: 15:}
    21. -: 16:

    此外还会有两个额外的文件 2.gcda  和 2.gcno ,2.gcno 是在编译时生成,2.gcda 是在运行时生成的,暂且不管他们的作用。

    使用 lcov 生成汇总报告和 html 网页:

    生成报告:

    lcov -t "anyNameOfCurrentTest" -o result.info -c -d .

    注意,这里的 -t 后跟着本次操作的名称,可以任意取名字,-o 后跟着结果文件名称,-c 表示抓取覆盖数据,-d 后跟着 2.gcda  和 2.gcno 这两个文件的存放路径,这点很重要。

    操作完毕后会生成一个文件 result.info

    生成 html 网页:

    genhtml -o result result.info

    这个时候会得到一个文件夹叫做 result,里面有:

    1. ├── amber.png
    2. ├── emerald.png
    3. ├── gc
    4. │   ├── 2.c.func.html
    5. │   ├── 2.c.func-sort-c.html
    6. │   ├── 2.c.gcov.html
    7. │   ├── index.html
    8. │   ├── index-sort-f.html
    9. │   └── index-sort-l.html
    10. ├── gcov.css
    11. ├── glass.png
    12. ├── index.html
    13. ├── index-sort-f.html
    14. ├── index-sort-l.html
    15. ├── ruby.png
    16. ├── snow.png
    17. └── updown.png

    用浏览器打开 index.html 即可得到汇总结果。

    LCOV 例外处理:

    有时候某些函数和某些语句就是不会覆盖,然后我们又不想把这些语句和函数纳入统计,作为例外。那么可以使用  // LCOV_EXCL_START  和 // LCOV_EXCL_STOP 把相应的语句和函数包裹起来即可。比如:

    1. // LCOV_EXCL_START
    2. void func()
    3. {
    4. 1==1;
    5. }
    6. // LCOV_EXCL_STOP

    如果对这个函数包裹,那么html 结果为:

    如果不包裹:

    1. void func()
    2. {
    3. 1==1;
    4. }

    则结果为:

     

     

  • 相关阅读:
    Gym 104025 M -Counting in Tree
    对于koa中间件的理解
    0基础学习VR全景平台篇 第100篇:美团酒店丨平台上传全景全流程
    面渣逆袭:半个小时成功拿下阿里一面HashMap追魂二十三问
    通过mfc 读写文本文件的中文乱码的解决方法
    第5章 总体设计【软件设计一般分为总体设计和详细设计,它们之间的关系是全局与局部】
    一文读懂什么是 OCR 识别
    【Cocos Creator 3.5实现赛车游戏】10.实现汽车节点的运动逻辑
    【Linux】awk入门
    MySQL数据库(基础)
  • 原文地址:https://blog.csdn.net/ykun089/article/details/126267204