- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在使用 gcov 获取我的应用程序的覆盖信息。但是,我的应用程序有 3 个实例同时运行,创建了 3 个版本的“gcda”文件。有没有办法在我的覆盖信息文件中合并相同“gcda”文件的不同版本。
我想以覆盖率信息为例。
最佳答案
我一直在研究同样的问题,这是我的发现。 TL;DR 是的,在最好的情况下,只需注意编译顺序,并以最一般(和最复杂)的方式使用 gcov-tool merge
命令,但它不是直截了当的的盒子,它需要一些专门的设置才能让它工作。
在我的示例中,我有一个库文件 lib.cpp
,其中包含两个函数:
#include <iostream>
void five(int n) {
if (n > 5) {
std::cout << n << " is greater than five" << std::endl;
} else {
std::cout << n << " is not greater than five" << std::endl;
}
}
void ten(int n) {
if (n > 10) {
std::cout << n << " is greater than ten" << std::endl;
} else {
std::cout << n << " is not greater than ten" << std::endl;
}
}
然后我有两个程序,每个程序都调用其中一个函数,five.cpp
#include <iostream>
#include "lib.hpp"
int main(int argc, char *argv[]) {
if (argc != 2) {
std::cerr << "usage: " << argv[0] << " <n>" << std::endl;
return 2;
}
int n = std::stoi(argv[1]);
five(n);
return 0;
}
和ten.cpp
#include <iostream>
#include "lib.hpp"
int main(int argc, char *argv[]) {
if (argc != 2) {
std::cerr << "usage: " << argv[0] << " <n>" << std::endl;
return 2;
}
int n = std::stoi(argv[1]);
ten(n);
return 0;
}
假设代码位于 /tmp/merge-gcov
目录中。
启用覆盖捕获可以像
g++ -O0 --coverage -o five five.cpp lib.cpp
这将创建 lib.gcno
和 five.gcno
文件。当 five
程序运行时,它将创建 /tmp/merge-gcov/lib.gcda
和 /tmp/merge-gcov/five.gcda
。请注意,这些 gcda 路径被硬编码到二进制文件中(但可以被操纵,稍后会详细介绍)。
./five 1
./five 12 # Results from multiple runs will accumulate in gcda files
mkdir report
gcovr -r . --html --html-details --output report/report.html
firefox report/report.html
到目前为止一切顺利。但是,如果我们现在也以同样的方式编译 10
程序
g++ -O0 --coverage -o ten ten.cpp lib.cpp
然后它将创建一个 lib.gcno
,它比 five
编译时使用的 lib.gcno
更新且不同。这意味着每当 five
或 ten
在另一个之后运行时,它会检测到 lib.gcda
文件不符合其预期(的gcno origin) 并重置文件内容,从而丢弃任何累积的先前内容。
这可以通过先单独编译 lib.cpp
文件来避免,例如
g++ -O0 --coverage -c lib.cpp
g++ -O0 --coverage -o five lib.o five.cpp
g++ -O0 --coverage -o ten lib.o ten.cpp
现在 five
和 ten
将共享相同的 lib.gcno
并且它们都将累积 lib.gcda
.
因此,如果您注意所有共享代码在链接二进制文件之前只编译一次,那么您应该能够从多个二进制文件中累积覆盖率结果。
但是如果我们想以不同的方式编译库怎么办?也许我们想编译一个禁用调试代码的版本和一个启用调试代码的版本,以验证代码在这两种情况下都能正常工作。那么之前的解决方案就不起作用了,取而代之的策略是将每个二进制文件放入其自己的目录中,然后再合并这些目录。
g++ -O0 --coverage -c lib.cpp -DENABLE_DEBUG
g++ -O0 --coverage -o five lib.o five.cpp
mkdir gcov-five
mv *.gcno gcov-five/.
注意到我说过 gcda 路径之前是硬编码的吗?您可以接受它,运行每个二进制文件,然后将 *.gcda
文件移动到后面。或者您可以设置环境变量以使程序使用不同的目录。 GCOV_PREFIX_STRIP 将从完整路径的开头截取目录,例如GCOV_PREFIX_STRIP=1
和 /tmp/merge-gcov/lib.gcda
变为 merge-gcov/lib.gcda
。 GCOV_PREFIX 变量将放在路径的前面。
export GCOV_PREFIX=/tmp/merge-gcov/gcov-five
export GCOV_PREFIX_STRIP=2
# Gives /tmp/merge-gcov/gcov-five/lib.gcda
./five 1
./five 12
# Repeat for ten
g++ -O0 --coverage -c lib.cpp -DDISABLE_DEBUG
g++ -O0 --coverage -o ten lib.o ten.cpp
mkdir gcov-ten
mv *.gcno gcov-ten/.
export GCOV_PREFIX=/tmp/merge-gcov/gcov-ten
./ten 1
./ten 12
# Combine
gcov-tool merge --outdir merged gcov-five gcov-ten
关于c++ - 如何合并多个版本的gcda文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25059435/
我有两个使用通用 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)。 设置 : 我可以成功地交叉编译我的二进制文件,以我的特定
我是一名优秀的程序员,十分优秀!