标签: gcov

即使程序中止,如何强制gcov提取数据

我正在使用一个名为KLEE的测试生成工具,它为我的C99-Code创建了大量测试.然后我运行测试并用gcov检查线路覆盖.Gcov似乎在成功完成后在运行结束时更新覆盖数据.

但是,某些测试失败(断言声明不正确),导致程序中止,而gcov不计算此运行中涵盖的行.

有没有办法让gcov刷新任何退出的信息(不仅仅是成功)?

c gcov klee

7
推荐指数
1
解决办法
2961
查看次数

了解gcov文件中的分支

我正在尝试理解gcov工具的输出.没有选项运行它是有道理的,但我想尝试理解分支覆盖选项.不幸的是,很难理解分支机构的作用以及为什么不采用它们.下面是方法的输出(使用最新的LLVM/Clang构建进行编译).

function -[TestCoverageAppDelegate loopThroughArray:] called 5 returned 100% blocks executed 88%
        5:   30:- (NSInteger)loopThroughArray:(NSArray *)array {
        5:   31:    NSInteger i = 0;
       22:   32:    for (NSString *string in array) {
branch  0 taken 0
branch  1 taken 7
        -:   33:        
       22:   34:    }
branch  0 taken 4
branch  1 taken 3
branch  2 taken 0
branch  3 taken 3
        5:   35:    return i;
        -:   36:}
Run Code Online (Sandbox Code Playgroud)

我通过这个运行5次测试,传入nil,一个空数组,一个包含1个对象的数组,一个包含2个对象的数组和一个包含4个对象的数组.我可以猜测,在第一种情况下,分支1意味着"进入循环",但我不知道分支0是什么.在第二种情况下,分支0似乎再次循环,分支1似乎结束循环,分支3继续/退出循环,但我不知道分支2是什么或为什么/什么时候执行它.

如果有人知道如何破译分支信息,或者知道任何有关这一切的详细文档,我会很感激帮助.

xcode objective-c llvm gcov

7
推荐指数
1
解决办法
2964
查看次数

gcov忽略源文件中的行

我正在使用gcov来衡量我所贡献的c ++库的测试覆盖率.出于某种原因,gcov没有将许多文件中的行识别为可执行文件.在给定文件中的160行中,它会说其中40行是可执行的.例如:

           -:    0:Source:../evo/NK.h
    -:    0:Graph:test_driver.gcno
    -:    0:Data:test_driver.gcda
    -:    0:Runs:1
    -:    0:Programs:1
    -:    1://  This file is part of Empirical, https://github.com/devosoft/Empirical
    -:    2://  Copyright (C) Michigan State University, 2016.
    -:    3://  Released under the MIT Software license; see doc/LICENSE
    -:    4://
    -:    5://
    -:    6://  This file provides code to build NK-based algorithms.
    -:    7:
    -:    8:#ifndef EMP_EVO_NK_H
    -:    9:#define EMP_EVO_NK_H
    -:   10:
    -:   11:#include <array>
    -:   12:
    -:   13:#include "../tools/BitVector.h"
    -:   14:#include "../tools/const_utils.h"
    -:   15:#include "../tools/Random.h"
    -:   16:#include "../tools/vector.h" …
Run Code Online (Sandbox Code Playgroud)

c++ testing profiling gcov gcovr

7
推荐指数
1
解决办法
449
查看次数

constexpr 构造函数不会显示覆盖率数据

今天我将我的矩阵类重写为constexpr. 我对这个类有 100% 的单元测试覆盖率,但我注意到在将几乎所有函数转换为 constexpr 后,构造函数的一部分在 lcov 中被标记为根本不再被覆盖。

这是只有构造函数的类。

template<typename T, std::size_t m, std::size_t n>
class Matrix
{
static_assert(std::is_arithmetic<T>::value,
                  "Matrix can only be declared with a type where "
                  "std::is_arithmetic is true.");

public:
    constexpr Matrix(
        std::initializer_list<std::initializer_list<T>> matrix_data)
    {
        if (matrix_data.size() != m)
        {
            throw std::invalid_argument("Invalid amount of rows.");
        }

        for (const auto& col : matrix_data)
        {
            if (col.size() != n)
            {
                throw std::invalid_argument("Invalid amount of columns.");
            }
        }


        std::size_t pos_i = 0;
        std::size_t pos_j = 0;

        for (auto …
Run Code Online (Sandbox Code Playgroud)

c++ unit-testing code-coverage gcov lcov

7
推荐指数
1
解决办法
701
查看次数

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
查看次数

处理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
查看次数

将 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
查看次数

本机代码覆盖与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
查看次数