gpt4 book ai didi

c++ - 在库中使用 __gcov_flush 不会强制其他模块生成 .gcda 文件

转载 作者:行者123 更新时间:2023-11-30 17:21:50 26 4
gpt4 key购买 nike

最近我一直在尝试使用 gcc/gcov 对 C++ 项目进行代码覆盖率测试。该项目由主模块和几个.so库组成,都应该进行测量。

我已经用 gcc 编译了带有 --coverage 参数的所有模块,并将它们保存在生成​​的位置,以及相应的 .gcno 标记文件。正常执行并正常退出后,可以正确生成 .gcda 文件。问题是,该程序应该是一个不会中断或终止的服务,并且不允许在主模块中插入任何自定义代码(如信号处理程序)。正如网络上的解决方案所建议的,我在独立的 .so 库中编写了一个信号处理函数,该函数在接收 SIGUSR1 信号时调用 __gcov_flush 将运行时覆盖计数器刷新到文件.

然而,我们观察到,虽然__gcov_flush函数保证被正确调用,但在运行时只生成.so库的.gcda文件。在我看来,__gcov_flush负责刷新包装器模块的数据,而不是其他模块的数据。我想知道这是否应该是这样工作的,或者我需要注意一些技巧才能生成完整的结果吗?

最佳答案

我在这里看到两个问题。

  • 如果您的可执行文件加载多个共享库,那就很难了以获得所需的功能。链接器添加分析代码libgcov.a 对于每个共享库,很难调用每个库的 __gcov_flush() 来自一个中心位置,例如信号处理程序在另一个共享库中定义。

  • 声明了 libgcov.a 中的 __gcov_flush() 函数与 __attribute__ ((__visibility__ ("hidden")))

如果从存档中提取_gcov.o并运行

objdump -t _gcov.o

你会看到类似的东西

   _gcov.o:     file format elf32-littlearm

SYMBOL TABLE:
000014b4 g F .text 00000016 .hidden __gcov_flush

即使您要求链接器这样做,它也不会导出隐藏符号 正如它提到的herehere

所以我看到第二个问题有两种解决方案。

  1. 您可以尝试在libgcov.a中编辑_gcov.o的符号表并将可见性设置为“default”而不是“hidden”。我没拿那样是因为我没有找到任何好的 Sprite 编辑器。

    如果您成功做到了这一点,请确保更新您的链接命令,以便它链接这个修补过的 _gcov.o 而不是默认的libgcov.a。基本上,您需要从中删除 --coverage 选项您的链接器对此进行了标记。

  2. 您可以为 __gcov_flush() 创建一个包装器,声明并导出它正如上面链接中所建议的那样。从您的共享库中的信号处理程序。

    我建议您不要为小信号处理程序添加分析库 - 确实没有必要。

关于c++ - 在库中使用 __gcov_flush 不会强制其他模块生成 .gcda 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28164543/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com