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

退出打印视图

更新时间: 2016 年 6 月
 
 

使用 uncover

使用 Uncover 生成覆盖信息的过程分为三个步骤:

  1. 检测二进制文件

  2. 运行检测过的二进制文件

  3. 生成并查看覆盖报告

  4. 共享库的覆盖

本节介绍了三个步骤,并提供了使用 Uncover 的示例。

检测二进制文件

输入的二进制文件可以是可执行文件或共享库。必须分别检测要分析的每个二进制文件。

使用 uncover 命令检测二进制文件。例如,以下命令将检测二进制文件 a.out,并使用检测过的 a.out 来覆盖输入 a.out。该命令还将创建一个后缀为 .uc 的目录(本例中为 a.out.uc),将在该目录中收集覆盖数据。输入二进制文件的副本保存在此目录中。

如果您具有二进制文件 a.out 和共享库 mylib.so,请按如下方式对其进行检测:

$ uncover a.out
$ uncover mylib.so

检测二进制文件时,可以使用以下选项:

–c

启用指令、块和函数的执行计数报告。缺省情况下,仅报告已覆盖或未覆盖的代码的信息。检测二进制文件和生成覆盖报告时,均指定该选项。

–d directory

directory 中创建覆盖数据目录。对于 uncover 来说,此选项特别重要,因为使用过程中的全部三个阶段需要访问完全相同的目录。–d 选项与 <full_path_of_coverage_directory> 结合使用,可确保 uncover 的不同阶段在同一位置查找覆盖目录。如果不将 –d 与完整的路径名一起使用,则查找覆盖目录时可能会出现不一致,从而导致其他问题,例如由于信息不完整而找到多个配置文件目录。

–m on | off

在使用 –c 运行时选项收集执行计数时启用或禁用线程安全分析。此选项必须与 –c 选项结合使用,否则将不起任何作用。缺省情况下,–c 选项启用线程安全配置文件计数。 缺省值设置为 on。要收集单线程应用程序的配置文件计数,请使用 –c –m off 选项。这样将关闭对于单线程应用程序不必要的线程安全性功能,从而更快地运行配置文件。

–o output-binary-file

将检测过的二进制文件写入指定的文件。缺省情况下,使用检测过的文件覆盖输入二进制文件。

如果对某个已检测的输入二进制文件运行 uncover 命令,uncover 将发出错误消息,指出已检测该二进制文件,无法再次检测,您可以运行该二进制文件来生成覆盖数据。

运行检测过的二进制文件

检测二进制文件后,您可以按正常方式运行它。每次运行检测过的二进制文件时,都会在 uncover 执行检测期间创建的、后缀为 .uc 的覆盖数据目录中收集代码覆盖数据。由于 uncover 数据收集是多线程安全的,并且是多进程安全的,因此,对进程中的并发运行数量或线程数量没有限制。覆盖数据将累积所有的运行和线程。

生成并查看覆盖报告

要生成覆盖报告,请对覆盖数据目录运行 uncover 命令。例如,对二进制文件 a.out 和共享库 mylib.so

$ uncover a.out.uc
$ uncover mylib.so.uc

此命令将根据 a.out.uc 目录中的覆盖数据生成一个名为 binary-name.er 的 Oracle Developer Studio 性能分析器实验目录,启动性能分析器 GUI,并显示该实验。当前目录或起始目录中存在 .er.rc 文件可能会影响性能分析器显示实验的方式。有关 .er.rc 文件的更多信息,请参见Oracle Developer Studio 12.5:性能分析器

可以生成 HTML 格式的报告在 Web 浏览器中查看它,或者生成 ASCII 格式的报告在终端窗口中进行查看。还可以将数据定向到代码分析器可以分析和显示它的目录。

–a

将错误数据写入 binary-name.analyze/coverage 目录以供代码分析器使用。

–c

启用指令、块和函数的执行计数报告。缺省情况下,仅报告已覆盖或未覆盖的代码的信息。(检测二进制文件和生成覆盖报告时,均指定该选项。)

–e on | off

确定是否为覆盖报告生成实验目录以及是否在性能分析器 GUI 中显示实验。缺省值为 on

–H html-directory

在指定的目录中以 HTML 格式保存覆盖数据,并在 Web 浏览器中自动显示这些数据。

–h–?

显示帮助。

–n

生成覆盖报告,但不启动性能分析器或 Web 浏览器等查看器。

–t ascii-file

在指定的文件中生成 ASCII 覆盖报告。

–V

输出 uncover 版本并退出。

–v

详细。输出 Uncover 正在执行的操作的日志。

仅启用一种输出格式。如果指定多个输出选项,则 uncover 使用命令中的最后一个选项。

示例 3  uncover 命令示例
$ uncover a.out

此命令将检测二进制文件 a.out,覆盖输入 a.out,在当前目录中创建 a.out.uc 覆盖数据目录,并在 a.out.uc 目录中保存输入 a.out 的副本。如果已检测 a.out,将显示警告消息,并且不执行检测。

$ uncover mylib.so

此命令将检测共享库 mylib.so,覆盖输入 mylib.so,在当前目录中创建 mylib.so.uc 覆盖数据目录,并在 mylib.so.uc 目录中保存输入 mylib.so 的副本。如果已检测 mylib.so,将显示警告消息,并且不执行检测。

$ uncover -d coverage a.out

此命令在目录 coverage 中创建 a.out.uc 覆盖目录。

$ uncover a.out.uc

此命令会使用 a.out.uc 覆盖目录中的数据在工作目录中创建代码覆盖实验 (a.out.er),并启动性能分析器以显示该实验。

$ uncover mylib.so.uc

此命令会使用 mylib.so.uc 覆盖目录中的数据在工作目录中创建代码覆盖实验 (mylib.so.er),并启动性能分析器以显示该实验。

$ uncover -H a.out.html a.out.uc

此命令使用 a.out.uc 覆盖目录中的数据在 a.out.html 目录中创建 HTML 代码覆盖报告,并在 Web 浏览器中显示该报告。

$ uncover -t a.out.txt a.out.uc

此命令使用 a.out.uc 覆盖目录中的数据在 a.out.txt 文件中创建 ASCII 代码覆盖报告。

$ uncover -a a.out.uc

此命令会使用 a.out.uc 覆盖目录中的数据在 binary-name.analyze/coverage 目录中创建覆盖报告,以供代码分析器使用。

共享库的覆盖

应用程序中的每个二进制文件需要单独进行检测。 例如,如果应用程序具有可执行文件 a.out 和共享库 libfoo.so,则您需要分别对其进行检测,以便得到两者的覆盖。

以下命令将检测可执行文件 a.out 和共享库 libfoo.so

% uncover -d <coverage_dir> a.out
% uncover -d <coverage_dir> libfoo.so

以下命令将运行应用程序以收集 <coverage_dir>/a.out.uc<coverage_dir>/libfoo.so.uc 中的覆盖数据。

./a.out

以下命令将显示可执行文件 a.out

% uncover <coverage_dir>/a.out.uc

以下命令将查看共享库 libfoo.so 的覆盖。

% uncover <coverage_dir>/libfoo.so.uc