You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 /编译阶段路径/=/本地当前路径/
  • 生成报告时的过滤规则不要误删自研模块路径,常见错误是执行lcov --remove过滤内核源码时,将自研模块的存储路径也加入过滤规则,导致无有效数据。

4. 特殊场景适配

  • 5.10以下版本内核的KUnit对独立外部模块的gcov支持存在缺陷,需将自研模块源码和KUnit测试代码放在同一目录下,编译为同一个内核模块运行测试,不要分成两个独立模块。
  • 确认测试运行阶段自研模块被成功加载,未因依赖缺失、签名校验失败等问题未加载,模块未加载时不会产生任何覆盖率统计数据。

内容的提问来源于stack exchange,提问作者PMDP3

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 01:24:08