Oracle® Solaris Studio 12.4:Discover 和 Uncover 用户指南

退出打印视图

更新时间: 2015 年 12 月
 
 

了解性能分析器中的覆盖报告

缺省情况下,在对覆盖目录运行 uncover 命令时,会在 Oracle Solaris Studio 性能分析器中以实验的形式打开覆盖报告。本节介绍显示覆盖数据的性能分析器界面。

有关性能分析器的更多信息,请参见集成帮助和Oracle Solaris Studio 12.4:性能分析器

"Overview"(概述)屏幕

在性能分析器中打开覆盖报告时,将显示 "Overview"(概述)屏幕。此视图显示您正在运行的实验、实验的度量以及度量预览。

下图显示了性能分析器中的 "Overview"(概述)屏幕。

image:性能分析器中 “Overview“(概述)屏幕上的未覆盖报告

"Functions"(函数)视图

在导航面板中,单击 "Functions"(函数)视图可显示程序的函数和专用度量。要按照特定度量的值对数据进行排序,请单击所需的列标题。单击列标题下的箭头可以反转排序顺序。

这些度量包括以下各项:

bit_UNCV

未覆盖计数器,指示可为该函数覆盖的字节数。

bit_fcoun

函数计数器,指示被覆盖的函数。

bit_E

指令执行计数器,指示是否在函数中执行了某个指令。

bit_BCV_%

块覆盖率计数器,指示在函数中覆盖的块所占的百分比。

bit_ICV_%

指令覆盖率计数器,指示在函数中覆盖的指令所占的百分比。

下图显示了性能分析器中的一个覆盖报告,按 bit_UNCV 排序。

image:性能分析器中 Uncover 报告的 “Functions“(函数)视图

"Uncoverage"(未覆盖)计数器 (bit_UNCV)

bit_UNCV 度量(也称为未覆盖计数器)是 uncover 的一项非常强大的功能。如果使用此列作为排序键,则在降序排列时,显示在最上面的函数是最有可能提高覆盖率的函数。在上图中,test_for_memory_leak() 函数位于列表的顶端,因为它在 bit_UNCV 列中的数值最大。function_with_small_functionality()test_for_doublefree()test_for_ves() 函数按字母表顺序列出,因为它们的数值相同。

test_for_memory_leak() 函数的 bit_UNCV 数目是指,在向套件中添加一个测试以调用该函数时可能覆盖的代码字节数。根据函数的结构,覆盖率实际增加的量会有所不同。如果该函数没有分支,并且它调用的所有函数也是直线型函数,则覆盖将增加指定的字节数。但是,覆盖增长通常会小于潜在值,也许会小很多。

bit_UNCV 列中使用非零值的未覆盖函数称为根未覆盖函数,表示它们都由覆盖函数调用。仅由非根未覆盖函数调用的函数没有自己的未覆盖数目。可以推定,在后续运行中,随着测试套件的改进而覆盖了潜力较大的未覆盖函数,这些函数将成为覆盖或未覆盖函数。

覆盖数目是非独占性的。

"Function Count"(函数计数)计数器 (bit_fcoun)

bit_fcoun 会报告已覆盖的函数和未覆盖的函数。如果计数为零,表示该函数未覆盖。如果计数非零,表示该函数已覆盖。如果执行了函数中的任一指令,该函数将视为已覆盖。

可以检测到此列中的非顶层未覆盖函数。如果某个函数的 bit_fcoun 为零,并且 bit_UNCV 也为零,则该函数不是顶层覆盖函数。

"Instr Exec"(指令执行)计数器 (bit_E)

bit_E 计数器会显示已覆盖的指令和未覆盖的指令。零计数表示未执行指令,非零计数表示已执行指令。

在 "Functions"(函数)视图中,该计数器会显示为每个函数执行的指令总数。此计数器还出现在 "Source"(源)视图和 "Disassembly"(反汇编)视图中。

"Block Covered %"(块覆盖率)计数器 (bit_BCV_%)

对于每个函数,"Block Covered %"(块覆盖率)计数器为 bit_BCV_%,该计数器显示该函数中已覆盖的基本块的百分比。此数值指示函数被覆盖的程度。请忽略 "Total"(总计)行中的此条目,它是列中百分比之和,没有意义。

"Instr Covered %"(指令覆盖率)计数器 (bit_ICV_%)

对于每个函数,bit_ICV_% 计数器会显示该函数中已覆盖指令百分比。此数值指示函数被覆盖的程度。请忽略 "Total"(总计)行中的此条目,它是列中百分比之和,没有意义。

"Source"(源)视图

如果二进制文件是使用 –g 选项编译的,"Source"(源)视图将显示程序的源代码。由于 uncover 在二进制文件级别上检测您的程序,并且已使用优化设置编译程序,因此,此视图中的覆盖信息很难解释。

"Source"(源)视图中的 bit_E 计数器显示了为每个源代码行执行的指令数,它本质上是语句级别的代码覆盖信息。非零值表示该语句已覆盖;零值表示该语句未覆盖。变量声明和注释没有 bit_E 计数。

下图显示了打开的 "Source"(源)视图的一个示例。

image:性能分析器的 Uncover 报告的 “Source“(源)视图

对于没有与其关联的任何覆盖信息的源代码行,行是空白的,任何字段中都没有数值。出现这些空行的原因如下:

  • 注释、空白行、声明和其他语言结构不包含可执行的代码。

  • 由于以下某个原因,编译器优化删除了与这些行对应的代码:

    • 代码从不执行(死代码)。

    • 代码可以执行,但为冗余代码。

有关更多信息,请参见使用 uncover 时的限制

"Disassembly"(反汇编)视图

如果在 "Source"(源)视图中选择一行,然后选择 "Disassembly"(反汇编)视图,性能分析器将在二进制文件中查找选定的行,并显示其反汇编。


提示  -  如果未在 "View"(视图)窗格中看到 "Disassembly"(反汇编),请选择 "More Views..."(更多视图...),然后选中 "Disassembly"(反汇编)选项。

此视图中的 bit_E 计数器显示了每个指令的执行次数:

image:性能分析器的 Uncover 报告的 “Disassembly“(反汇编)视图

"Inst-Freq"(指令频率)视图

"Inst-Freq"(指令频率)视图会显示总体覆盖摘要。

image:性能分析器的 Uncover 报告的 “Inst-Freq“(指令频率)视图