c++ - C++ 库的 CodeCoverage 不会突出显示所有行

标签 c++ code-coverage

我有一个 C++ 库,我正在使用 vsinstr.exe 对其进行检测,然后运行 ​​vsperfmon.exe。当我在 Visual Studio 中打开 .coverage 文件时,我看到一些行没有以任何颜色突出显示,而且我确信这些行已被命中。这可能是什么原因?当我为 C# 库运行相同的程序时,不会发生这种情况。虽然我是 C++ 的新手,但这并没有帮助,但我的一些简单代码行没有显示为命中,例如新变量的声明或对其他方法的调用。

最佳答案

如果您运行二进制代码检测器,它无法检测不存在的代码。因此,优化后的代码即使在逻辑上执行,也无法被二进制检测器看到。

如果您检测源代码,那么即使编译器优化“去除”某些代码,检测(有副作用)也不会被优化去除。逻辑上执行的代码仍然从目标文件中消失,但是当它被执行时,该代码的检测仍然存在并被执行。因此,您会收到检测信号,表明优化代码实际上已“执行”。

发生这种情况是因为源检测利用了编译器以及它在优化时必须如何保持行为。这是另一个例子:

         for (i=0;i<1000000;i++)
         {  executed[5923]=true;
            <body>
         }

显示的是检测 代码。 “执行[k]=真;”是表示循环体已执行的探测器(针对“第 k 个”程序代码块)。二进制仪器可能会在目标代码中执行与此等效的操作。现在,当循环运行时,探测会在每次迭代时执行。如果这是一个关键循环,性能会受到影响,因此 instrumentatino 会影响时序行为,有时会很严重。 (我们注意到被检测的目标代码被丢弃了)。

使用源检测,您可以获得此源文本。 (就像目标代码案例一样,你不保留它,你只需编译并运行它,然后丢弃检测过的源代码。)不同之处在于优化编译器将探针识别为具有循环不变效应,并且像这样重写对象:

         executed[5923]=true;
         for (i=0;i<1000000;i++)
         {  <body>
         }

仪器的成本实际上已经变为零。因此,源代码检测提供的执行时间更接近未检测的程序。

当然,如果您测试未优化的程序,那么大概您并不关心二进制或源检测的额外开销。在那种情况下,即使是二进制工具也会显示(本来可以但)未优化的代码,如果它被执行的话。

我们的 Test Coverage tools为许多语言做源检测,包括 C++(甚至是 Visual C++ 方言,包括 C++14)。它将向您展示所涵盖的优化代码。您无需执行任何特殊操作即可获得“正确”答案。

关于c++ - C++ 库的 CodeCoverage 不会突出显示所有行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28636963/

相关文章:

c++ - 读取输入文件,最快的方式可能吗?

c++ - 将列表从 python 传递到 C++ vector 时如何加速 Boost::Python::Extract

c++ - 在一个具有恒定总和的范围内生成N个随机数

code-coverage - 如何让Jenkins忽略 "% Conditionals"(W列)中的 "Coverage Metric Targets"

grails - 如何安装和使用Grails测试覆盖率?

c++ - 在带有转换运算符的初始化程序的情况下,复制列表初始化的假定行为是什么?

c++ - 方形列表 "Compare Constructor"实现

c - 根据差异确定要运行的单元测试

python - 如何在长时间运行的进程中运行 coverage.py?

java - 覆盖java工具