跳过导航链接 | |
退出打印视图 | |
![]() |
Oracle Solaris Studio 12.3:Discover 和 Uncover 用户指南 Oracle Solaris Studio 12.3 Information Library (简体中文) |
准备好目标二进制文件后,下一步就是对其进行检测。检测功能会在至关重要的位置添加代码,以便在运行二进制文件时 Discover 能够跟踪内存操作。
可使用 discover 命令检测二进制文件。例如,以下命令将检测二进制文件 a.out,并使用检测过的 a.out 来覆盖输入 a.out:
discover a.out
当您运行检测过的二进制文件时,Discover 将监视该程序对内存的使用情况。在运行期间,Discover 会向 HTML 文件(在本例中,缺省情况下该文件为 a.out.html)中写入一份报告,其中详细列出了内存访问错误,可使用 Web 浏览器来查看该文件。检测二进制文件时,可以使用 -w 选项请求将报告写入 ASCII 文件或 stderr。
可以使用 -n 选项指定希望 Discover 对二进制文件执行只写检测。
当 Discover 检测二进制文件时,如果 Discover 发现任何由于未注释而导致无法检测的代码,Discover 将显示如下警告:
discover: (warning): a.out: 80% of code instrumented (16 out of 20 functions)
无注释代码可能来自链接到二进制文件中的汇编语言代码,或者来自使用早于必须正确准备二进制文件中所列版本的编译器或操作系统编译的模块。
当 Discover 检测某个二进制文件时,将向该二进制文件中添加代码。当在运行时装入相关的共享库时,这些代码会配合运行时链接程序对这些共享库进行检测。检测过的库存储在高速缓存中;如果原始库自上次检测以来未发生更改,可以重新使用这些库。缺省情况下,高速缓存目录为 $HOME/SUNW_Bit_Cache。您可以使用 -D 选项来更改该目录。
如果整个程序(包括所有共享库)均已检测,Discover 将生成最准确的结果。缺省情况下,Discover 仅检查并报告可执行文件中的内存错误。可以使用 -c 选项指定希望 Discover 检查相关共享库和通过 dlopen() 动态打开的库中的错误。可以使用 -n 选项指定希望 Discover 跳过检查可执行文件中的错误。
如果使用 -c 选项避免检查特定库中的错误,则 Discover 不会报告该库中的任何错误。不过,Discover 需要跟踪整个地址空间的内存状态,以正确检测内存错误,因此 Discover 会记录整个程序(包括所有的共享库)中的分配和内存初始化。
应根据必须正确准备二进制文件中的说明准备程序使用的所有共享库。缺省情况下,如果运行时链接程序遇到一个未准备好的库,会发生致命错误。但是,您可以让 Discover 忽略一个或多个库。
某些库可能无法准备,或者出于其他某种原因无法检测。要解决此问题,您可以使用 -s、-T 或-N 选项(请参见检测选项)或 bit.rc 文件中的规范(请参见bit.rc 初始化文件)让 Discover 忽略这些库,但是,这样准确性会有所降低。
如果某个库无法检测,且无法标识为可忽略,Discover 将在检测时失败,或者程序将在运行时失败并出现错误消息。
缺省情况下,Discover 使用 bit.rc 系统文件中的规范将未准备好的系统库和编译器提供的库设置为可忽略。由于 Discover 了解最常用库的内存特征,因此,对准确性的影响微乎其微。
您可以将以下选项与 discover 命令结合使用来检测二进制文件。
将错误数据写入 binary_name.analyze/dynamic 目录以供代码分析器使用。
运行检测过的程序时,将自动启动 Web 浏览器 browser(缺省情况下关闭)。
将检测过的二进制文件写入 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 格式写入报告。
以 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 格式写入报告。
仅在报告中显示 n 个内存错误(缺省情况下显示所有错误)。
仅在报告中显示 n 个内存泄漏(缺省情况下显示 100 个)。
在报告中显示偏移(缺省情况下隐藏偏移)。
在报告中显示改编名称(缺省情况下显示取消改编名称)。
仅在报告中显示 n 个堆栈帧(缺省情况下显示 8 个)。
检查所有库中、指定的 library 中或指定的 file 中所列出的库中的错误。
不检查可执行文件中的错误。
在轻量模式下运行 Discover。使用此选项可以更快地执行程序,并且无需特意根据必须正确准备二进制文件中的说明准备程序,但只能检测到有限数量的错误。
指定希望运行二进制文件时,如果使用 Discover 检测过的该二进制文件派生时会出现的情况。缺省情况下,Discover 继续从父进程收集内存访问错误数据。如果希望 Discover 在派生之后从子进程收集内存访问数据,请指定 -F child。
执行检测以便使用线程分析器进行数据争用检测。如果使用此选项,仅在运行时执行数据争用检测,而不执行其他任何内存检查。必须使用 collect 命令运行检测过的二进制文件,以生成可以在性能分析器中查看的实验(请参见《Oracle Solaris Studio 12.3 线程分析器用户指南》。
尝试检测一个无法检测的二进制文件时发出警告,但不标出错误。
仅检测命名的二进制文件。在运行时不检测任何相关的共享库。
不检测与前缀 library 匹配的任何相关共享库。如果库名称的前几个字符与 library 匹配,则忽略该库。如果 library 以 / 开头,则根据库的绝对完整路径名进行匹配。否则,根据库的基本名称进行匹配。
不读取 bit.rc 初始化文件(请参见bit.rc 初始化文件)。
将 cache_directory 用作存储缓存的检测过的二进制文件的根目录。缺省情况下,高速缓存目录为 $HOME/SUNW_Bit_Cache。
强制重新检测高速缓存中找到的所有库。
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 环境变量设置为命令行选项 -b、-e、-E、-f、-F、-H、-l、-L、-m、-S 和 -w 的列表,以更改检测过的二进制文件的运行时行为。例如,如果要将报告的错误数更改为 50 并将报告中的堆栈深限制为 3,可以将此环境变量设置为 -e 50 -s 3。
缺省情况下,如果运行已使用 Discover 检测过的二进制文件时,该二进制文件发生派生,则 Discover 会继续从父进程收集内存访问错误数据。如果希望 Discover 在派生之后从子进程收集内存访问数据,请设置 SUNW_DISCOVER_FOLLOW_FORK_MODE 环境变量。