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

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操作失败;

相关文章:

  • App使用webview套壳引入h5(二)—— app内访问h5,顶部被手机顶部菜单遮挡问题,保留顶部安全距离
  • 从Copilot到Agent,AI Coding是如何进化的?
  • [特殊字符] 一文了解目前主流的 Cursor AI 免费续杯工具!
  • 使用logrotate切割nginx日志
  • NX985NX988美光固态闪存NY103NY106
  • 【论文解读】MemGPT: 迈向为操作系统的LLM
  • 【如何做好应用架构?】
  • 基于WSL搭建Ubnutu 20.04.6 LTS(二)-部署Docker环境
  • 【强化学习】——03 Model-Free RL
  • 【前端】js如何处理计算精度问题
  • 并发编程 - go版
  • Go中的协程并发和并发panic处理
  • Ubuntu ssh 永久添加私钥
  • TripGenie:畅游济南旅行规划助手:个人工作纪实(九)
  • JMeter 实现 MQTT 协议压力测试 !
  • 大陆4D毫米波雷达ARS548调试
  • MySQL 的 redo log 和 binlog 区别?
  • 探秘鸿蒙 HarmonyOS NEXT:实战用 CodeGenie 构建鸿蒙应用页面
  • 窗口聚合窗口聚合
  • 【C++11新特性】
  • 网站开发技术介绍/欧洲站fba
  • 如何自己做一个网站/免费推广引流平台有哪些
  • 茂名网站制作网页/网站关键词推广
  • php如何做视频网站/搜索引擎营销与seo优化
  • 温州大型网站建设/如何制作一个网页页面
  • 手机网站建设找哪家/营销软文范例大全