Oracle® Developer Studio 12.5:Discover 和 Uncover 用户指南

退出打印视图

更新时间: 2016 年 6 月
 
 

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

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

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

"Overview"(概述)屏幕

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

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

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

"Functions"(函数)视图

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

这些度量包括以下各项:

Uncoverage(未覆盖)

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

Function Count(函数计数)

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

Instr Exec(指令执行)

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

Block Covered %(块覆盖率)

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

Instr Covered %(指令覆盖率)

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

下图显示了性能分析器中的一个覆盖报告,按 "Uncoverage"(未覆盖)排序。

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

"Uncoverage"(未覆盖)计数器

"Uncoverage"(未覆盖)计数器是一项极其强大的 uncover 功能。如果使用此列作为排序键,则在降序排列时,显示在最上面的函数是最有可能提高覆盖率的函数。在上图中,test_for_memory_leak() 函数位于列表的顶端,因为它在 "Uncoverage"(未覆盖)列中的数值最大。

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

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

覆盖数目是非独占性的。

Function Count(函数计数)

"Function Count"(函数计数)列报告已覆盖的函数和未覆盖的函数。如果计数为零,表示该函数未覆盖。如果计数非零,表示该函数已覆盖。如果执行了函数中的任一指令,该函数将视为已覆盖。

可以检测到此列中的非顶层未覆盖函数。如果 "Function Count"(函数计数)和 "Uncoverage"(未覆盖)列均为零,则表示该函数不是顶层覆盖函数。

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

"Instr Exec"(指令执行)计数器显示已覆盖的指令和未覆盖的指令。零计数表示未执行指令,非零计数表示已执行指令。

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

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

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

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

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

"Source"(源)视图

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

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

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

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

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

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

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

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

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

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

"Disassembly"(反汇编)视图

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


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

此视图中的 "Instr Exec"(指令执行)计数器显示了每个指令的执行次数:

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

"Instruction Frequency"(指令频率)视图

"Instruction Frequency"(指令频率)视图显示总体覆盖情况摘要:

image:性能分析器的 “Uncover“(未覆盖)报告的 “Instruction Frequency“(指令频率)视图