gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:47:16 25 4
gpt4 key购买 nike

我有一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com