标签: gcov

Bjam用于gcov覆盖分析?

我希望为一个主要用C++编写的项目集成一个非平凡的跨平台构建系统.到目前为止,我已经评估了Cmake和Scons,虽然它们都代表了对(GNU)make的改进,但在我尝试使用这些工具的上下文中,这两种方法似乎都不优雅或透明.这让我进入了Boost Build(Bjam)并且我很受鼓舞,因为我的项目依赖于Boost,bjam应该可用于任何可行的目标平台.

我试图将代码覆盖整齐地集成到库的单元测试中,以便最终集成到构建服务器(如Jenkins)中,我遇到了困难.虽然我愿意接受Bjam最佳/标准练习的指导,但我认为我需要三种不同的"变体":

  • release - 仅构建优化的静态库
  • debug - 构建非优化的静态库和单元测试
  • coverage - 构建启用coverage的库并与启用非coverage的单元测试相关联.

本质上,除了标准的调试和发布版本之外,我还想要一个专门用于收集覆盖数据的调试版本.

我需要使用(至少)g ++和msvc构建...并且只使用g ++的gcov开关.这意味着我的库目标需要与单元测试可执行目标不同的"compilerflags"...并且仅针对我的一个编译器套件...并且仅针对一个变体.

我不清楚如何最好地用Bjam实现这一点 - 但是,我怀疑,它应该是一个相当常见的用例.Bjam是否明确支持gcov覆盖率分析(可能使用lcov呈现结果)?如果没有,任何人都可以推荐一种支持上述(简化)方案的策略吗?

c++ boost code-coverage bjam gcov

6
推荐指数
1
解决办法
771
查看次数

GCC的代码覆盖选项如何工作?

请考虑以下命令:

gcc -fprofile-arcs -ftest-coverage main.c
Run Code Online (Sandbox Code Playgroud)

它生成要由gcov使用的文件main.gcda,以生成覆盖率分析.那么main.gcda是如何生成的?仪器如何完成?我可以看到检测代码吗?

c gcc code-coverage gcov

6
推荐指数
2
解决办法
1万
查看次数

处理gcov数据文件以进行跟踪

我正在尝试创建一个类似于TraceGL的工具,但是对于C类语言:

在此输入图像描述

如您所见,上面的工具突出显示未以红色执行的代码流.

例如,在为Objective-C构建此工具方面,我知道gcov(和clang中的libprofile_rt)输出的数据文件可以帮助确定给定代码行的执行次数.但是,gcov数据文件是否能够告诉我在程序执行期间何时发生了一行代码?

例如,如果在代码路径A和B期间调用第X行,我是否能够从gcov确定代码路径A和B仅在给定行X的情况下称为行X?

gcc llvm clang instruments gcov

6
推荐指数
1
解决办法
437
查看次数

如何合并多个版本的gcda文件?

我正在使用 gcov 来获取我的应用程序的覆盖范围信息。但是,我的应用程序有 3 个实例同时运行,创建了 3 个版本的“gcda”文件。有没有办法在我的覆盖信息文件中合并相同“gcda”文件的不同版本。

我只想将覆盖范围信息作为一个实例。

c++ gcov lcov

6
推荐指数
1
解决办法
2131
查看次数

当在堆栈中创建对象时,即使具有100%的代码覆盖率,功能覆盖也较少

我正在用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"时才会调用哪些隐藏函数?

c++ gcov lcov

6
推荐指数
1
解决办法
1265
查看次数

lcov 将带有函数声明的行标记为可达但未覆盖

我正在尝试使用 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 中的测试工具。

c++ code-coverage clang gcov lcov

6
推荐指数
1
解决办法
2394
查看次数

将 lcov 与 gcc-8 一起使用

我正在尝试确定我的测试覆盖率。为此,我使用较新版本的 gcc 编译我的程序:

\n\n
CC=/usr/local/gcc8/bin/gcc  FC=/usr/local/gcc8/bin/gfortran ./configure.sh  -external cmake -d\n
Run Code Online (Sandbox Code Playgroud)\n\n

使用选项编译后,--coverage我运行测试并创建*.gcda,*.gcno*.o.provides.build文件。如果我运行类似的东西:

\n\n
> $ /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\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

这表明 gcov 运行良好。但是,如果我尝试对这些结果运行 lcov:

\n\n
lcov -t "result" -o ex_test.info -c -d CMakeFiles/\n
Run Code Online (Sandbox Code Playgroud)\n\n

对于每个文件,我都会收到类似以下的错误消息:

\n\n
Processing 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!\n
Run Code Online (Sandbox Code Playgroud)\n\n

这与我使用系统标准时收到的错误消息相同/usr/bin/gcov

\n\n

这让我相信 lcov 调用旧的 gcov 而不是新的。如何强制 gcov 使用新版本?

\n

gcov lcov

6
推荐指数
1
解决办法
5257
查看次数

在SonarQube中,“覆盖线”和“未覆盖线”度量之间的含义有何不同?

我正在SonarQube分析过的C ++项目的“度量”选项卡中查看“覆盖率”报告。在该页面上,我的摘要信息如下:

SonarQube覆盖范围概述

“覆盖线”和“未覆盖线”指标之间有什么区别?

我查看了sonarqube网站的“度量标准定义”页面,但是那里的两个条目对我没有帮助。

要覆盖的行-单元测试可以覆盖的代码行数(例如,空白行或完整的注释行不视为要覆盖的行)。

未覆盖的行 -单元测试未涵盖的代码数。

读起来,我希望未覆盖的行数比要覆盖的行数多,因为前者可能包括空行。如果sonarqube有点理解代码,那么它也可能会从“单元测试可能涵盖”数字中排除异常处理。

给定的数字显然是相反的,所以我一定不能正确理解含义。


我有一些作为CI系统一部分运行的单元测试,并且使用lcov和gcov编译了它们的代码覆盖率。lcov数据通过genhtml传递,以生成单独的覆盖率报告,该报告目前在某些情况下提供数据,因此我可能会遇到部分配置错误的问题,这增加了混乱。

unit-testing code-coverage gcov lcov sonarqube

6
推荐指数
1
解决办法
2553
查看次数

本机代码覆盖与android soong构建系统

我正在尝试使用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

android code-coverage gcov android-source android-soong

6
推荐指数
1
解决办法
818
查看次数

GCOV 版本不匹配 - 预期 700e 得到 408R

在一台装有 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 的服务器打印该错误消息

c python gcc gcov python-c-api

6
推荐指数
1
解决办法
5732
查看次数