当前位置: 首页 > ops >正文

linux下覆盖率测试总结

以下是常见的覆盖率测试方法及其适用场景的总结:

文章目录

      • **一、基于 GCC 的 GCOV/LCOV(适用于 C/C++)**
        • **原理**
        • **工具链**
      • **二、应用程序覆盖率测试**
      • **三、内核代码覆盖率(Linux 内核)**
        • **方法**

一、基于 GCC 的 GCOV/LCOV(适用于 C/C++)

原理

通过 GCC 的 -fprofile-arcs-ftest-coverage 编译选项插入特殊标记,运行时生成 .gcda(执行计数)和 .gcno(代码结构)文件,再用工具分析。

工具链
  • gcov:GCC 自带,生成基础覆盖率数据。
  • lcov:生成 HTML 可视化报告。
  • genhtml:生成html报告

二、应用程序覆盖率测试

  1. 编译时启用覆盖

    gcc -fprofile-arcs -ftest-coverage -o myapp myapp.c
    
  2. 部署并运行程序:将myapp部署到linux系统测试机上,运行测试,生成文件夹(包含“myapp.gcda”),将“myapp.gcda”拷贝到编译机的同“myapp.c”目录下

  3. 生成报告

    # 简单文本报告
    gcov myapp.c# 生成 HTML 报告(使用 lcov)
    lcov --capture --directory . --output-file coverage.info  #或者:lcov -c -d . -o coverage.info()
    genhtml coverage.info --output-directory coverage_report  #或者:genhtml coverage.info -o coverage_report
    

三、内核代码覆盖率(Linux 内核)

方法
  1. 配置内核

    make ARCH=arm menuconfig
    # 启用 CONFIG_GCOV_KERNEL和CONFIG_DEBUG_FS
    CONFIG_DEBUG_FS=y
    CONFIG_GCOV_KERNEL=y
    #开启整个内核覆盖率测试(按实际需求开启,不是所有的架构都支持整个内核开启覆盖率统计)
    CONFIG_GCOV_PROFILE_ALL=y
    
  2. 针对需要进行测试的文件进行配置

#举例,开启串口覆盖率测试#1)、单文件测试:sunxi-uart.c#对应Makefile添加:GCOV_PROFILE_sunxi-uart.o := yCFLAGS_sunxi-uart.o += -O0 -fprofile-update=atomic #多线程,中断环境建议开启此项#2)、对某个目录会编译的源文件进行测试:#对应Makefile添加:GCOV_PROFILE := yGCOV_PROFILE_xxx.o := n      #不包括某个文件
  1. 编译并烧录系统到测试机

  2. 测试并收集数据

    #启用debugfs文件系统
    1、mount -t debugfs /sys/kernel/debug/
    2、cp /sys/kernel/debug/gcov /root/ -r #/root为目标存放路径(根据实际情况决定)
    3、tar -cvf gcov.tar /root/gcov #将gcov文件夹压缩
    4、将gcov.tar拷贝到编译机目录下,比如kernel 同级目录gcov_test下或者scp直接传输:
    scp -i ~/home/xxx root@200.200.201.1:/root/gcov.tar ./gcov_test
    
  3. 生成报告

    1、tar -xvf gcov.tar #解压缩
    ##生成info文件
    2、lcov -d ./gcov -c -o ./coverage.info -b /home/xx/xxx/xxx/kernel/  #/home/xx/xxx/xxx/kernel/ 对应编译机目标内核的绝对路径
    3、genhtml coverage.info -o ./report #生成html报告
    
  4. 注意事项

  • 如果后期删除了.gcno或.gcda文件,再次编译NK时发现没有生成.gcno和.gcda文件了,此时需在linux目录下执行:make clean,然后重新编译NK
  • 执行:echo 1 > /sys/kernel/debug/gcov/reset 可将所有的gcov统计数据清0
  • 第一次编译出了NK,在进行测试时,因某种原因再次进行了NK编译,此时生成的.gcno和测试机生成的.gcda会因为时间不对应导致后续执行lcov操作失败;
http://www.xdnf.cn/news/12212.html

相关文章:

  • SQL Server相关的sql语句
  • React Hooks 指南:何时使用 useEffect ?
  • 鸿蒙APP测试实战:从HDC命令到专项测试
  • 【连接器专题】案例:FPC焊接金手指顶层和底层开窗/焊盘为什么要错位?
  • 《计算机是怎么跑起来的》第二章读后感
  • LeetCode 70 爬楼梯(Java)
  • 【深度学习】为什么2个3×3的卷积可以相当于一个5×5的卷积核?为什么3个3×3的卷积相当于一个7×7的卷积核,到底区别在哪里?我们该如何使用?
  • ESP32C3中BLE开发问题汇总
  • 数字图像处理第二次实验
  • 日语学习-日语知识点小记-构建基础-JLPT-N4阶段(32):そうやすいにくいすぎ(過ぎ)
  • 链表相关知识
  • 一键切换不同状态,3D数字孪生场景搭建更便捷!
  • 【iOS】cache_t分析
  • Qt 按钮类控件(Push Button 与 Radio Button)(1)
  • COMSOL学习笔记-静电场仿真
  • 可视化图解算法48:有效括号序列
  • DFORMER: RETHINKING RGBD REPRESENTATION LEARNING FOR SEMANTIC SEGMENTATION 论文浅析
  • 电厂数字孪生:智能优化助力碳中和
  • 【定昌linux开发板】设置用户密码过期时间
  • eNSP实现WDS手拉手业务
  • 如何做好一份技术文档?(上篇)
  • Spring AI(11)——SSE传输的MCP服务端
  • Spring Plugin框架应用实践:医院多租户客户端动态路由方案解析
  • App使用webview套壳引入h5(二)—— app内访问h5,顶部被手机顶部菜单遮挡问题,保留顶部安全距离
  • 两个错误教训记录--java变量作用域问题导致变量值异常
  • calico/node is not ready: BIRD is not ready: BGP not established with xxx
  • sumatraPDF设置深色界面
  • ArcGIS Maps SDK for JavaScript:使用图层过滤器只显示FeatureLayer的部分要素
  • LG P9990 [Ynoi Easy Round 2023] TEST_90 Solution
  • 风机下引线断点检测算法实现