我希望为一个主要用C++编写的项目集成一个非平凡的跨平台构建系统.到目前为止,我已经评估了Cmake和Scons,虽然它们都代表了对(GNU)make的改进,但在我尝试使用这些工具的上下文中,这两种方法似乎都不优雅或透明.这让我进入了Boost Build(Bjam)并且我很受鼓舞,因为我的项目依赖于Boost,bjam应该可用于任何可行的目标平台.
我试图将代码覆盖整齐地集成到库的单元测试中,以便最终集成到构建服务器(如Jenkins)中,我遇到了困难.虽然我愿意接受Bjam最佳/标准练习的指导,但我认为我需要三种不同的"变体":
本质上,除了标准的调试和发布版本之外,我还想要一个专门用于收集覆盖数据的调试版本.
我需要使用(至少)g ++和msvc构建...并且只使用g ++的gcov开关.这意味着我的库目标需要与单元测试可执行目标不同的"compilerflags"...并且仅针对我的一个编译器套件...并且仅针对一个变体.
我不清楚如何最好地用Bjam实现这一点 - 但是,我怀疑,它应该是一个相当常见的用例.Bjam是否明确支持gcov覆盖率分析(可能使用lcov呈现结果)?如果没有,任何人都可以推荐一种支持上述(简化)方案的策略吗?
请考虑以下命令:
gcc -fprofile-arcs -ftest-coverage main.c
Run Code Online (Sandbox Code Playgroud)
它生成要由gcov使用的文件main.gcda,以生成覆盖率分析.那么main.gcda是如何生成的?仪器如何完成?我可以看到检测代码吗?
我正在尝试创建一个类似于TraceGL的工具,但是对于C类语言:

如您所见,上面的工具突出显示未以红色执行的代码流.
例如,在为Objective-C构建此工具方面,我知道gcov(和clang中的libprofile_rt)输出的数据文件可以帮助确定给定代码行的执行次数.但是,gcov数据文件是否能够告诉我在程序执行期间何时发生了一行代码?
例如,如果在代码路径A和B期间调用第X行,我是否能够从gcov确定代码路径A和B仅在给定行X的情况下称为行X?
我正在使用 gcov 来获取我的应用程序的覆盖范围信息。但是,我的应用程序有 3 个实例同时运行,创建了 3 个版本的“gcda”文件。有没有办法在我的覆盖信息文件中合并相同“gcda”文件的不同版本。
我只想将覆盖范围信息作为一个实例。
我正在用gcov分析我的代码.它说在堆栈中创建对象时,我的代码是2个函数.但是,当我做新删除100%功能覆盖是实现的.
码:
class Animal
{
public:
Animal()
{
}
virtual ~Animal()
{
}
};
int main()
{
Animal animal;
}
Run Code Online (Sandbox Code Playgroud)
我执行的命令用于生成gcov报告.
rm -rf Main.g* out.txt a.out coverage;
g++ -fprofile-arcs -ftest-coverage -lgcov -coverage Main.cpp;
./a.out;
lcov --capture --directory . --output-file out.txt;
genhtml out.txt --output-directory coverage;
Run Code Online (Sandbox Code Playgroud)
生成的htmls显示我的功能覆盖率为3/4 - 75%.
但是一旦我将堆栈对象更改为堆,
码:
class Animal
{
public:
Animal()
{
}
virtual ~Animal()
{
}
};
int main()
{
auto animal = new Animal;
delete animal;
}
Run Code Online (Sandbox Code Playgroud)
我的功能覆盖率是100%.
只有在调用"new"和"delete"时才会调用哪些隐藏函数?
我正在尝试使用 lcov(v1.13,在 OS X 上,使用 clang 作为编译器)为我的测试套件生成代码覆盖率,但我遇到了一个恼人的问题,我不知道如何解决。SO 上有几个类似的问题,但我找不到这个问题的解决方案。由于某种原因,函数/成员声明被标记为可访问但未执行,类似于下面的示例(这是标头中的内联方法定义):
这使得行覆盖率指标毫无用处,因此我希望有一种方法可以修复它,而无需将每个声明标记为 LCOV_EXCL_LINE。
使用的编译器标志非常标准:
-g -O0 -fno-inline -ftest-coverage -fprofile-arcs -fno-elide-constructors
Run Code Online (Sandbox Code Playgroud)
奇怪的是,源文件中的方法定义也标记为红色,尽管主体不是,例如:
// header.h
class Foo {
void bar(); // ignored, marked as unreachable
}
// header.cpp
void Foo::bar() { // marked as red (reachable / not executed)
do_something(); // marked as covered
}
Run Code Online (Sandbox Code Playgroud)
如果有任何重要性的话,源文件是静态库的一部分,该静态库静态链接到 CMake 中的测试工具。
我正在尝试确定我的测试覆盖率。为此,我使用较新版本的 gcc 编译我的程序:
\n\nCC=/usr/local/gcc8/bin/gcc FC=/usr/local/gcc8/bin/gfortran ./configure.sh -external cmake -d\nRun Code Online (Sandbox Code Playgroud)\n\n使用选项编译后,--coverage我运行测试并创建*.gcda,*.gcno和*.o.provides.build文件。如果我运行类似的东西:
> $ /usr/local/gcc8/bin/gcov slab_dim.f90.gcda [\xc2\xb1develop \xe2\x97\x8f]\nFile \'/Local/tmp/fleur/cdn/slab_dim.f90\'\nLines executed:0.00% of 17\nCreating \'slab_dim.f90.gcov\'\nRun Code Online (Sandbox Code Playgroud)\n\n这表明 gcov 运行良好。但是,如果我尝试对这些结果运行 lcov:
\n\nlcov -t "result" -o ex_test.info -c -d CMakeFiles/\nRun Code Online (Sandbox Code Playgroud)\n\n对于每个文件,我都会收到类似以下的错误消息:
\n\nProcessing fleur.dir/hybrid/gen_wavf.F90.gcda\n/Local/tmp/fleur/build.debug/CMakeFiles/fleur.dir/hybrid/gen_wavf.F90.gcno:version \'A82*\', prefer \'408R\'\n/Local/tmp/fleur/build.debug/CMakeFiles/fleur.dir/hybrid/gen_wavf.F90.gcno:no functions found\ngeninfo: WARNING: gcov did not create any files for /Local/tmp/fleur/build.debug/CMakeFiles/fleur.dir/hybrid/gen_wavf.F90.gcda!\nRun Code Online (Sandbox Code Playgroud)\n\n这与我使用系统标准时收到的错误消息相同/usr/bin/gcov
这让我相信 lcov 调用旧的 gcov 而不是新的。如何强制 gcov 使用新版本?
\n我正在SonarQube分析过的C ++项目的“度量”选项卡中查看“覆盖率”报告。在该页面上,我的摘要信息如下:
我查看了sonarqube网站的“度量标准定义”页面,但是那里的两个条目对我没有帮助。
要覆盖的行-单元测试可以覆盖的代码行数(例如,空白行或完整的注释行不视为要覆盖的行)。
未覆盖的行 -单元测试未涵盖的代码行数。
读起来,我希望未覆盖的行数比要覆盖的行数多,因为前者可能包括空行。如果sonarqube有点理解代码,那么它也可能会从“单元测试可能涵盖”数字中排除异常处理。
给定的数字显然是相反的,所以我一定不能正确理解含义。
我有一些作为CI系统一部分运行的单元测试,并且使用lcov和gcov编译了它们的代码覆盖率。lcov数据通过genhtml传递,以生成单独的覆盖率报告,该报告目前在某些情况下提供数据,因此我可能会遇到部分配置错误的问题,这增加了混乱。
我正在尝试使用soong构建系统使用AOSP源代码为我的本机组件生成代码覆盖率报告.
我扩展了aosp vhal,但单元测试用例与下面的链接相同. http://androidxref.com/8.1.0_r33/xref/hardware/interfaces/automotive/vehicle/2.0/default/tests/
尝试将以下内容添加到Android.bp中的cc_test,cc_binary
native_coverage : true,
cflags: [
"-g",
"-O0",
"-fprofile-arcs",
"-ftest-coverage",
],
ldflags : [
"-fprofile-arcs",
"-ftest-coverage",
],
Run Code Online (Sandbox Code Playgroud)
本地二进制单元测试覆盖是在out/target/product中生成的,但我找不到gcno中间体.
在命令下运行会为每个测试文件提供*.gcda文件.
adb shell \
GCOV_PREFIX=/data/local/tmp \
GCOV_PREFIX_STRIP=`echo $ANDROID_BUILD_TOP | grep -o / | wc -l` \
/data/local/tmp/unit-tests-coverage
Run Code Online (Sandbox Code Playgroud)
我试过下面的链接,但不知道如何继续:(
http://logan.tw/posts/2015/04/28/check-code-coverage-with-clang-and-lcov/ https://android.googlesource.com/platform/bionic.git/+/master- soong https://android.googlesource.com/platform/build/soong/+/581341d%5E%21/ https://android.googlesource.com/platform/external/e2fsprogs/+/fedfb27%5E%21/ https : //android.googlesource.com/platform/development/+/master/scripts/acov#23 http://androidxref.com/9.0.0_r3/xref/bionic/README.md#293
我不确定谷歌的vts框架是否可用于生成本机代码覆盖. https://codelabs.developers.google.com/codelabs/android-vts-8/#6
生成" gcnodir "但不确定如何使用它./coverage/data/nativetest64/vehicle-unit-tests-coverage/unit-tests-coverage.gcnodir
在一台装有 GCC 4.4.7/GCOV 4.4.7 的服务器上,我能够成功运行测试。然而,在具有 GCC 4.8.5/GCOV 4.8.5 的不同服务器上,运行测试会导致以下错误:
profiling:/path/to/foo.gcda:Version mismatch - expected 700e got 408R
Run Code Online (Sandbox Code Playgroud)
以下是版本的输出:
$ gcc --version
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-36)
$ gcov --version
gcov (GCC) 4.8.5 20150623 (Red Hat 4.8.5-36)
Run Code Online (Sandbox Code Playgroud)
经过搜索,这个错误似乎经常是由 gcc 和 gcov 版本不匹配引起的,但我的版本是相同的。
我们最近将此服务器上的 gcc 从 4.4.7 升级到 4.8.5。这个问题似乎是由升级引起的。
我应该提到,我正在测试 Python C 扩展,我认为这与测试普通 C 应用程序有点不同。
我执行以下操作:
export CFLAGS="--coverage"
python setup.py build_ext --inplace
python tests.py
Run Code Online (Sandbox Code Playgroud)
在两台服务器上,第二个命令都会.gcno相应地创建文件。
在 4.4.7 的服务器上,第三个命令将成功创建 .gcda 文件。但是 4.8.5 的服务器打印该错误消息
gcov ×10
lcov ×5
c++ ×4
gcc ×3
c ×2
clang ×2
android ×1
bjam ×1
boost ×1
instruments ×1
llvm ×1
python ×1
python-c-api ×1
sonarqube ×1
unit-testing ×1