我正在使用一个名为KLEE的测试生成工具,它为我的C99-Code创建了大量测试.然后我运行测试并用gcov检查线路覆盖.Gcov似乎在成功完成后在运行结束时更新覆盖数据.
但是,某些测试失败(断言声明不正确),导致程序中止,而gcov不计算此运行中涵盖的行.
有没有办法让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是什么或为什么/什么时候执行它.
如果有人知道如何破译分支信息,或者知道任何有关这一切的详细文档,我会很感激帮助.
我正在使用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) 今天我将我的矩阵类重写为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++编写的项目集成一个非平凡的跨平台构建系统.到目前为止,我已经评估了Cmake和Scons,虽然它们都代表了对(GNU)make的改进,但在我尝试使用这些工具的上下文中,这两种方法似乎都不优雅或透明.这让我进入了Boost Build(Bjam)并且我很受鼓舞,因为我的项目依赖于Boost,bjam应该可用于任何可行的目标平台.
我试图将代码覆盖整齐地集成到库的单元测试中,以便最终集成到构建服务器(如Jenkins)中,我遇到了困难.虽然我愿意接受Bjam最佳/标准练习的指导,但我认为我需要三种不同的"变体":
本质上,除了标准的调试和发布版本之外,我还想要一个专门用于收集覆盖数据的调试版本.
我需要使用(至少)g ++和msvc构建...并且只使用g ++的gcov开关.这意味着我的库目标需要与单元测试可执行目标不同的"compilerflags"...并且仅针对我的一个编译器套件...并且仅针对一个变体.
我不清楚如何最好地用Bjam实现这一点 - 但是,我怀疑,它应该是一个相当常见的用例.Bjam是否明确支持gcov覆盖率分析(可能使用lcov呈现结果)?如果没有,任何人都可以推荐一种支持上述(简化)方案的策略吗?
我正在尝试创建一个类似于TraceGL的工具,但是对于C类语言:

如您所见,上面的工具突出显示未以红色执行的代码流.
例如,在为Objective-C构建此工具方面,我知道gcov(和clang中的libprofile_rt)输出的数据文件可以帮助确定给定代码行的执行次数.但是,gcov数据文件是否能够告诉我在程序执行期间何时发生了一行代码?
例如,如果在代码路径A和B期间调用第X行,我是否能够从gcov确定代码路径A和B仅在给定行X的情况下称为行X?
我正在使用 gcov 来获取我的应用程序的覆盖范围信息。但是,我的应用程序有 3 个实例同时运行,创建了 3 个版本的“gcda”文件。有没有办法在我的覆盖信息文件中合并相同“gcda”文件的不同版本。
我只想将覆盖范围信息作为一个实例。
我正在尝试确定我的测试覆盖率。为此,我使用较新版本的 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我正在尝试使用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
c++ ×4
lcov ×3
c ×2
gcc ×2
llvm ×2
android ×1
bjam ×1
boost ×1
clang ×1
gcovr ×1
instruments ×1
klee ×1
objective-c ×1
profiling ×1
python ×1
python-c-api ×1
testing ×1
unit-testing ×1
xcode ×1