Oracle Solaris Studio 12.2 Discover 和 Uncover 用户指南

校验准备好的二进制文件

准备好目标二进制文件后,下一步就是对其进行校验。校验功能会在至关重要的位置添加代码,以便在运行二进制文件时 Discover 能够跟踪内存操作。

可使用 discover 命令校验二进制文件。例如,以下命令将校验二进制文件 a.out,并使用校验过的 a.out 来覆写输入 a.out


discover a.out

当您运行校验过的二进制文件时,Discover 将监视该程序对内存的使用情况。在运行期间,Discover 会向 HTML 文件(在本例中,缺省情况下该文件为 a.out.html)中写入一份报告,其中详细列出了内存访问错误,可使用 Web 浏览器来查看该文件。校验二进制文件时,可以使用 - 选项,请求将报告写入 ASCII 文件或 stderr

当 Discover 校验二进制文件时,如果由于该二进制文件未注释而导致 Discover 发现无法校验的代码,Discover 将显示如下警告:


discover: (warning): a.out: 80% of code instrumented (16 out of 20 functions)

无注释代码可能来自链接到二进制文件中的汇编语言代码,或者来自使用早于必须正确准备二进制文件中所列版本的编译器或操作系统编译的模块。

缓存共享库

当 Discover 校验某个库时,将向该库中添加代码。当在运行时装入相关的共享库时,这些代码会配合运行时链接程序对这些共享库进行校验。校验过的库存储在高速缓存中;如果原始库自上次校验以来未发生更改,可以重新使用这些库。缺省情况下,高速缓存目录为 $HOME/SUNW_Bit_Cache。您可以使用 -D 选项来更改该目录。

校验共享库

如果整个程序(包括所有共享库)均已校验,Discover 将生成最准确的结果。缺省情况下,当您校验主可执行文件时,Discover 会插入代码,这样,当您运行该程序时,Discover 会在所有共享库打开时自动校验这些共享库是静态链接在程序中的,还是由 dlopen() 动态打开的。

应根据必须正确准备二进制文件中的说明准备程序使用的所有共享库。缺省情况下,如果运行时链接程序遇到一个未准备好的库,会发生致命错误。但是,您可以让 Discover 忽略一个或多个库。

忽略库

某些库可能无法准备,或者出于其他某种原因无法校验。要解决此问题,您可以使用 -s-T-N 选项(请参见校验选项)或 bit.rc 文件中的规范(请参见bit.rc 初始化文件)让 Discover 忽略这些库,但是,这样准确性会有所降低。

如果某个库无法校验,且无法标识为可忽略,Discover 将在校验时失败,或者程序将在运行时失败并出现错误消息。

缺省情况下,Discover 使用 bit.rc 系统文件中的规范将未准备好的系统库和编译器提供的库设置为可忽略。由于 Discover 了解最常用库的内存特征,因此,对准确性的影响微乎其微。

命令行选项

您可以将以下选项与 discover 命令结合使用来校验二进制文件。

输出选项

-o file

将校验过的二进制文件写入 file。缺省情况下,校验过的二进制文件会覆写输入的二进制文件。

-w text_file

将 Discover 的二进制文件报告写入 text_file。该文件是在您运行校验过的二进制文件时创建的。如果 text_file 是相对路径名,则该文件位于与您运行校验过的二进制文件时所在工作目录相对的位置。要使每次运行二进制文件时该文件名均具有唯一性,请在文件名中添加字符串 %p,要求 Discover 运行时包含进程 ID。例如,选项 -w report.%p.txt 将生成一个文件名为 report.process_id.txt 的报告文件。如果文件名中包含多处 %p,只有第一个实例会替换为进程 ID。

如果不指定此选项或 -H 选项,会以 HTML 格式将报告写入 output_file.html,其中 output_file 是校验过的二进制文件的基本名称。该文件位于您运行校验过的二进制文件时所在的工作目录中。

您可以同时指定此选项和 -H 选项,同时以文本和 HTML 格式写入报告。

-H html_file

以 HTML 格式将 Discover 的二进制文件报告写入 html_file。此文件是在您运行校验过的二进制文件时创建的。如果 html_file 是相对路径名,则该文件位于与您运行校验过的二进制文件时所在工作目录相对的位置。要使每次运行二进制文件时该文件名均具有唯一性,请在文件名中添加字符串 %p,要求 Discover 运行时包含进程 ID。例如,选项 -H report.%p.html 会生成一个文件名为 report.process_id.html 的报告文件。如果文件名中包含多处 %p,只有第一个实例会替换为进程 ID。

如果不指定此选项或 -w 选项,会以 HTML 格式将报告写入 output_file.html,其中 output_file 是校验过的二进制文件的基本名称。该文件位于您运行校验过的二进制文件时所在的工作目录中。

您可以同时指定此选项和 -w 选项,同时以文本和 HTML 格式写入报告。

-e n

仅在报告中显示 n 个内存错误(缺省情况下显示所有错误)。

-E n

仅在报告中显示 n 个内存泄漏(缺省情况下显示 100 个)。

-f

在报告中显示偏移(缺省情况下隐藏偏移)。

-m

在报告中显示重整名称(缺省情况下显示取消重整名称)。

-S n

仅在报告中显示 n 个栈帧(缺省情况下显示 8 个)。

校验选项

-l

在轻量模式下运行 Discover。使用此选项可以更快地执行程序,并且无需特意根据必须正确准备二进制文件中的说明准备程序,但只能检测到有限数量的错误。

-i

使用线程分析器校验数据争用检测。如果使用此选项,仅在运行时执行数据争用检测,而不执行其他任何内存检查。必须使用 collect 命令运行校验过的二进制文件,以生成可以在性能分析器中查看的实验(请参见《Oracle Solaris Studio 12.2:线程分析器用户指南》)。

-s

尝试校验一个无法校验的二进制文件时发出警告,但不标出错误。

-T

仅校验命名的二进制文件。在运行时不校验任何相关的共享库。

-N library

不校验与前缀 library 匹配的任何相关共享库。如果库名称的前几个字符与 library 匹配,则忽略该库。如果 library 以 / 开头,则根据库的绝对完整路径名进行匹配。否则,根据库的基本名称进行匹配。

-K

不读取 bit.rc 初始化文件(请参见bit.rc 初始化文件)。

缓存选项

-D cache_directory

cache_directory 用作存储缓存的校验过的二进制文件的根目录。缺省情况下,高速缓存目录为 $HOME/SUNW_Bit_Cache

-k

强制重新校验高速缓存中找到的所有库。

其他选项

-h-?

帮助。输出简短的用法消息并退出。

-v

详细。输出 Discover 正在执行的操作的日志。重复使用该选项可获得更多信息。

-V

输出 Discover 版本信息并退出。

bit.rc 初始化文件

Discover 在启动时,会通过读取一系列 bit.rc 文件来初始化自身的状态。系统文件 Oracle_Solaris_Studio_installation_directory /prod/lib/postopt/bit.rc 为某些变量提供了缺省值。Discover 先读取此文件,然后依次读取 $HOME/.bit.rc(如果存在)和 current_directory/.bit.rc(如果存在)。

bit.rc 文件包含用于设置某些变量以及在某些变量中进行附加和删除的命令。当 Discover 读取 set 命令时,会放弃变量的前一个值(如果有)。当读取 append 命令时,会将参数附加到变量的现有值(该参数置于冒号分隔符后面)。当读取 remove 命令时,将从变量的现有值中删除参数及其冒号分隔符。

bit.rc 文件中设置的变量包括校验时要忽略的库列表,以及计算库中无注释(未准备)代码百分比时要忽略的函数或函数前缀的列表。

有关更多信息,请参阅 bit.rc 系统文件头中的注释。

SUNW_DISCOVER_OPTIONS 环境变量

可以通过将 SUNW_DISCOVER_OPTIONS 环境变量设置为命令行选项 -b-e-E-f-H-l-L-m-S-w 的列表,以更改校验过的二进制文件的运行时行为。例如,如果要将报告的错误数更改为 50 并将报告中的栈深限制为 3,可以将此环境变量设置为 -e 50 -s 3