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

CodeCoverage of C++ libraries doesn't highlight all lines

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

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

如果您检测 source,那么即使编译器优化了 "away" 某些代码,instrumentation(具有副作用)没有得到优化。逻辑上执行的代码仍然从目标文件中消失,但是当它被执行时,该代码的检测仍然存在并被执行。因此,您会收到检测信号,表明优化代码实际上 "executed" 有效。

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

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

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

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

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

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

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

我们的 Test Coverage tools 为包括 C++(甚至包括 C++14 在内的 Visual C++ 方言)在内的多种语言进行源检测。它将向您展示所涵盖的优化代码。您无需执行任何特殊操作即可获得 "right" 答案。