跳过导航链接 | |
退出打印视图 | |
![]() |
Oracle Solaris Studio 12.3:Discover 和 Uncover 用户指南 Oracle Solaris Studio 12.3 Information Library (简体中文) |
缺省情况下,在对覆盖目录运行 uncover 命令时,会在 Oracle Solaris Studio 性能分析器中以实验的形式打开覆盖报告。分析器使用 "Functions"(函数)、"Source"(源)、"Disassembly"(反汇编)和 "Inst-Freq"(指令频率)选项卡来显示覆盖数据。
在分析器中打开覆盖报告时,"Functions"(函数)选项卡处于选中状态。该选项卡显示了一些列,其中列出了每个函数的 "Uncoverage"(未覆盖)、"Function Count"(函数计数)、"Instr Exec"(指令执行)、"Block Covered %"(块覆盖率)和 "Instr Covered %"(指令覆盖率)计数器。单击任何一列的标题可以将该列设置为数据的排序键。单击列标题上的箭头可以反转排序顺序。
"Uncoverage"(未覆盖)度量是一项极其强大的 Uncover 功能。如果使用此列作为排序键,降序排列时,显示在最上面的函数是最有可能提高覆盖率的函数。在本例中,main() 函数位于列表的顶端,因为它在 "Uncoverage"(未覆盖)列中的数目最多。(sigprof() 和 sigprofh() 函数的数目相同,因此它们按字母顺序排列。)
main() 函数的未覆盖数目是指,向导致调用该函数的套件添加一个测试时可能覆盖的代码的字节数。根据函数的结构,覆盖率实际增加的量会有所不同。如果该函数没有分支,并且它调用的所有函数也是直线型函数,则覆盖确实只会增加指定的字节数。但一般而言,覆盖增长会小于潜在值,也许会小很多。
"Uncoverage"(未覆盖)列中使用非零值的未覆盖函数称为根未覆盖函数,表示它们都由覆盖函数调用。仅由非根未覆盖函数调用的函数没有自己的未覆盖数目。可以推定,在后续运行中,随着测试套件的改进而覆盖了潜力较大的未覆盖函数,这些函数将成为覆盖或未覆盖函数。
覆盖数目是非独占性的。
"Function Count"(函数计数)报告已覆盖的函数和未覆盖的函数。关键在于计数是零还是非零。如果计数为零,表示该函数未覆盖。如果计数非零,表示该函数已覆盖。如果执行了函数中的任一指令,该函数将视为已覆盖。
可以检测到此列中的非顶层未覆盖函数。如果某个函数的函数计数是零,并且未覆盖数目也是零,表示该函数不是顶层覆盖函数。
"Instr Exec"(指令执行)计数器显示已覆盖的指令和未覆盖的指令。零计数表示未执行指令,非零计数表示已执行指令。
在 "Functions"(函数)选项卡中,该计数器显示为每个函数执行的指令总数。此计数器还出现在 "Source"(源)选项卡(请参见`Source`(源)选项卡)和 "Disassembly"(反汇编)选项卡(请参见`Disassembly`(反汇编)选项卡)中。
对于每个函数,"Block Covered %"(块覆盖率)计数器显示该函数中被覆盖的基本块的百分比。通过此数目可以大致了解函数的覆盖情况。请忽略 <Total> 行中的这个数字,它是列中的百分比之和,没有意义。
对于每个函数,"Instr Covered %"(指令覆盖率)计数器显示该函数中被覆盖的指令的百分比。通过此数目也可以大致了解函数覆盖的情况。请忽略 <Total> 行中的这个数字,它是列中百分比之和,没有意义。
如果二进制文件是使用 -g 选项编译的,"Source"(源)选项卡将显示程序的源代码。由于 Uncover 在二进制文件级别上检测您的程序,并且已使用优化设置编译程序,因此,此选项卡中的覆盖信息很难解释。
"Source"(源)选项卡中的 "Instr Exec"(指令执行)计数器显示了为每个源代码行执行的指令数,它本质上是语句级别的代码覆盖信息。非零值表示该语句已覆盖;零值表示该语句未覆盖。变量声明和注释没有指令执行计数。
一些源代码行可能不具有与其相关联的任何覆盖信息。在这些情况下,行为空白,并且所有字段中都没有数字。出现这些行的原因是:
注释、空白行、声明和其他语言结构不包含可执行的代码。
编译器优化已删除与行对应的代码,原因是:
代码从不执行(死代码)。
代码可以执行,但为冗余代码。
有关更多信息,请参见使用 Uncover 时的限制。
如果在 "Source"(源)选项卡中选择一行,然后选择 "Disassembly"(反汇编)选项卡,分析器将在二进制文件中查找选定的行,并显示其反汇编。
此选项卡中的 "Instr Exec"(指令执行)计数器显示了每个指令的执行次数。
"Inst-Freq"(指令频率)选项卡显示总的覆盖摘要。