gcov无法正确识别KUnit测试的代码覆盖率问题如何解决
KUnit内核模块测试gcov无覆盖率问题解决方案
1. 编译配置校验(最常见问题)
- 必须开启内核核心gcov配置:
CONFIG_GCOV_KERNEL=y,5.1及以上内核需同时开启CONFIG_GCOV_PROFILE_ALL=y;如果不需要全局开启内核代码覆盖率统计,需单独为自研模块、KUnit测试代码添加编译参数,不可全局关闭gcov配置。 - 关闭干扰配置项:
CONFIG_RANDSTRUCT_NONE=y(关闭结构随机化避免符号映射错误)、CONFIG_DEBUG_INFO_REDUCED=n(保留完整调试信息)、CONFIG_GCOV_TESTS=n(避免内核自带gcov测试用例干扰)。 - 外部独立编译模块需在Makefile中为所有目标文件添加gcov编译参数,示例如下:
CFLAGS_your_module.o += -fprofile-arcs -ftest-coverage CFLAGS_kunit_test_cases.o += -fprofile-arcs -ftest-coverage
2. 测试运行阶段数据采集校验
- 使用kunit.py执行测试时必须添加
--gcov参数,工具会自动从测试环境中提取gcov统计数据,命令示例:./tools/testing/kunit/kunit.py run --gcov。 - 若手动在QEMU/UML环境运行测试,不可直接终止测试环境,需先将
/sys/kernel/debug/gcov/路径下对应自研模块、测试代码的.gcda统计文件,拷贝到宿主机编译目录下和对应.gcno文件同路径存放,再关闭测试环境。gcov统计数据仅在模块卸载、内核正常关机时才会写入debugfs,提前终止会导致数据丢失。
3. 覆盖率报告生成阶段校验
- gcov根据绝对路径匹配
.gcno(编译时生成)和.gcda(运行时生成)文件,若编译时的源码路径和生成报告时的本地路径不一致,需添加路径映射修正:- 原生gcov命令添加参数:
gcov -o <gcda文件目录> --prefix <编译阶段源码前缀> <目标源码文件路径> - lcov生成报告添加参数:
lcov --capture --directory . --output-file coverage.info --path-mapping /编译阶段路径/=/本地当前路径/
- 原生gcov命令添加参数:
- 生成报告时的过滤规则不要误删自研模块路径,常见错误是执行
lcov --remove过滤内核源码时,将自研模块的存储路径也加入过滤规则,导致无有效数据。
4. 特殊场景适配
- 5.10以下版本内核的KUnit对独立外部模块的gcov支持存在缺陷,需将自研模块源码和KUnit测试代码放在同一目录下,编译为同一个内核模块运行测试,不要分成两个独立模块。
- 确认测试运行阶段自研模块被成功加载,未因依赖缺失、签名校验失败等问题未加载,模块未加载时不会产生任何覆盖率统计数据。
内容的提问来源于stack exchange,提问作者PMDP3
相关产品推荐
相关产品推荐

