【问题标题】:gcda files are not generated while running the functional test cases on the instrumented image在检测映像上运行功能测试用例时不生成 gcda 文件
【发布时间】:2023-06-23 23:20:01
【问题描述】:

我正在尝试为 C 文件(Yocto 项目)生成覆盖范围。

所以,我在大多数可用模块的 Makefile.am 中添加了 gcov 标志 "-g -O0 --coverage"

它在编译每个带有覆盖标志的模块期间生成“.gcno”文件。

我已经从所有这些模块中生成了一个图像并将其加载到测试设备中并运行了功能测试用例。

我可以使用正在运行测试设备的进程中的字符串命令找到“gcda”文件的路径。

所以我使用 gdb 模式在将进程 ID 附加到 gdb 后使用“__gcov_flush”命令刷新覆盖范围。

这会引发错误“当前上下文中没有符号 __gcov_flush”。请建议我可能导致此错误的原因。

【问题讨论】:

  • 不是生成文件问题。删除了不正确的标签。
  • 请查看您的构建日志(如果您没有看到任何命令,请启用详细模式),然后添加一个示例编译器命令行,即来自您期望 --coverage 的模块使用,以及问题文本的链接器命令。为了使覆盖工作,您需要在编译链接命令行中启用它。
  • 感谢 Stefan Becker 的回复。实际上我正在构建一个 yocto 图像,因此使用 bitbake 来编译代码。所以没有make命令行来添加调试模式。编译成功地为一个模块生成了 .gcno。在运行模块的功能测试用例时,不会生成 .gcda 文件。
  • 您是否尝试覆盖 Linux 内核或驱动程序模块?
  • 是的,Ameya。我们正在尝试覆盖 Yocto 模块(内核和驱动程序)

标签: c instrumentation gcov


【解决方案1】:

根据 cmets,直接使用 Coverage Compiler 标志构建 Linux 内核并假设获得有意义的覆盖率指标是不可能的。

代码覆盖率指标实际上需要一些文件系统可用于写入运行时覆盖率数据(即 *.gcda 文件)。

如果您想为 Linux 内核启用代码覆盖率 here 是有关如何使用 GCOV 虚拟文件系统来启用支持以收集覆盖率指标的文档。

此外,假设您正在为不同的架构进行交叉编译,那么在执行后捕获 *.gcno 文件后,您可能必须使用 cross-gcov 工具来收集覆盖率指标。

【讨论】:

    最近更新 更多