- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
最近我一直在尝试使用 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
即使您要求链接器这样做,它也不会导出隐藏符号 正如它提到的here或here
所以我看到第二个问题有两种解决方案。
您可以尝试在libgcov.a
中编辑_gcov.o
的符号表并将可见性设置为“default”
而不是“hidden”
。我没拿那样是因为我没有找到任何好的 Sprite 编辑器。
如果您成功做到了这一点,请确保更新您的链接命令,以便它链接这个修补过的 _gcov.o
而不是默认的libgcov.a
。基本上,您需要从中删除 --coverage
选项您的链接器对此进行了标记。
您可以为 __gcov_flush()
创建一个包装器,声明并导出它正如上面链接中所建议的那样。从您的共享库中的信号处理程序。
我建议您不要为小信号处理程序添加分析库 - 确实没有必要。
关于c++ - 在库中使用 __gcov_flush 不会强制其他模块生成 .gcda 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28164543/
我有两个使用通用 C++ 类的主要函数。 文件 1: main.cpp #include #include "HelloAnother.h" int main() {
我正在尝试使用 iPhone 模拟器分析我的代码。我已启用生成测试覆盖率文件和仪器程序流程,并将-lgcov添加到链接器标志中。根据我读到的所有内容,这应该是我在设置方面需要做的全部事情。 更新:生成
我使用 gcov 进行代码覆盖率分析,并使用 lcov 生成覆盖率的图形输出。这对于至少已执行目标文件的某些部分的代码文件非常有效。我希望能够跟踪根本没有执行的文件。我怀疑这与没有为这些文件生成 .g
我目前面临为静态库的覆盖数据生成 .gcda 文件的问题。我可以获得大多数文件的覆盖率数据,但不是全部。 我将缺少覆盖率数据的目标文件称为 X。 一些注意事项: 我已经使用适当的标志编译了库和测试可执
我想使用 gcov 和 lcov 生成覆盖率报告。 到现在为止我做了什么 :- 1. I compiled my code using --fprofile-arcs and -fprofile-co
我有几个针对应用程序的单元测试,每个测试都能够生成 .gcda 文件。我希望能够生成统一的 .gcda 文件,这些文件代表整个测试套件的覆盖范围。似乎没有一种简单的方法可以做到这一点,但我可能是错的,
注意:这可以被视为 Gcov is not generating *.gcda file 的副本,但是: 这个问题没有答案 我认为 OP 的系统与我不同,所以我认为我只去编辑他的问题是不行的。而且,问
我正在尝试使用主目录中的 lcov 生成代码覆盖率报告。源代码使用 -coverage 选项编译,以在编译时生成覆盖率信息(创建 gcno 文件)。然后我将可执行文件和 gcno 文件复制到主目录。我
我正在尝试使用主目录中的 lcov 生成代码覆盖率报告。源代码使用 -coverage 选项编译,以在编译时生成覆盖率信息(创建 gcno 文件)。然后我将可执行文件和 gcno 文件复制到主目录。我
我尝试使用 -fprofile-arcs 和 -ftest-coverage 运行 gcov,但没有任何链接。 它给出了这个错误:- hidden symbol `__gcov_init' in /
我正在尝试生成 C 文件的覆盖范围(Yocto 项目)。 因此,我在大多数可用模块的 Makefile.am 中添加了 gcov 标志“-g -O0 --coverage”。 它在编译每个带有覆盖标志
我已经尝试了很多我创建的解决方案,但都没有奏效。我正在为一个项目编写一个新代码,但是这段代码被很多硕士和博士学位所触动,他们不在乎使其可读性。因此,确实有很多东西没有用,甚至没有用过。 然后我开始关注
是否可以通过运行链接到使用 --coverage 选项构建的共享库的可执行文件来生成 gcov 数据文件(.gcda 文件)? 基本上,我的主库由多个 c++ 文件编译到一个共享库中,然后是一个名为“
我有相同的源文件(C 和 Obj-C)被编译成两个目标:单元测试可执行文件和实际产品(然后进行集成测试)。这两个目标构建到不同的位置,因此目标文件、.gcno 和 .gcda 文件是分开的。并非所有源
我想知道当 iOS 应用程序在 Xcode 机器人上运行单元测试时如何生成 gcda 文件。 我用了this blog配置 Xcode 以生成测试覆盖率文件并使用利用 lcov 的脚本生成报告。我可以
最近我一直在尝试使用 gcc/gcov 对 C++ 项目进行代码覆盖率测试。该项目由主模块和几个.so库组成,都应该进行测量。 我已经用 gcc 编译了带有 --coverage 参数的所有模块,并将
我有一个用 Cmake 编译的项目。我使用 Gcov 来了解在目标上执行期间的代码覆盖率。我使用 GCOV_PREFIX 来更改 .gcda 文件的目录。但是我在这个目录中只有 45 个 .gcda
我手头有一个带有 cmocka 测试的 C 项目,它是使用 CMake 构建的。现在我尝试使用 gcov 来确定测试覆盖率并使用此 CMake 模块:https://github.com/bilke/
问题: 我正在使用以下标志生成我的 Qt 应用程序(.pro 文件)的代码覆盖率: QMAKE_CXXFLAGS += --coverage QMAKE_LFLAGS += --coverage 代码
执行摘要:我想使用 GDB 来提取存储在我的嵌入式目标内存中的覆盖执行计数,并使用它们来创建 .gcda文件(用于输入 gcov/lcov)。 设置 : 我可以成功地交叉编译我的二进制文件,以我的特定
我是一名优秀的程序员,十分优秀!