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报告
二、应用程序覆盖率测试
-
编译时启用覆盖:
gcc -fprofile-arcs -ftest-coverage -o myapp myapp.c
-
部署并运行程序:将myapp部署到linux系统测试机上,运行测试,生成文件夹(包含“myapp.gcda”),将“myapp.gcda”拷贝到编译机的同“myapp.c”目录下
-
生成报告:
# 简单文本报告 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 内核)
方法
-
配置内核:
make ARCH=arm menuconfig # 启用 CONFIG_GCOV_KERNEL和CONFIG_DEBUG_FS CONFIG_DEBUG_FS=y CONFIG_GCOV_KERNEL=y #开启整个内核覆盖率测试(按实际需求开启,不是所有的架构都支持整个内核开启覆盖率统计) CONFIG_GCOV_PROFILE_ALL=y
-
针对需要进行测试的文件进行配置
#举例,开启串口覆盖率测试#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 #不包括某个文件
-
编译并烧录系统到测试机
-
测试并收集数据:
#启用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
-
生成报告:
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报告
-
注意事项:
- 如果后期删除了.gcno或.gcda文件,再次编译NK时发现没有生成.gcno和.gcda文件了,此时需在linux目录下执行:make clean,然后重新编译NK
- 执行:echo 1 > /sys/kernel/debug/gcov/reset 可将所有的gcov统计数据清0
- 第一次编译出了NK,在进行测试时,因某种原因再次进行了NK编译,此时生成的.gcno和测试机生成的.gcda会因为时间不对应导致后续执行lcov操作失败;