Oracle Solaris Studio 12.4 Man Pages

Exit Print View

Updated: January 2015
 
 

er_print(1)

Name

er_print - 从一个或多个性能实验输出 ASCII 报告

Synopsis

er_print [ -script script | -command | -V ] experiment-list

Description

er_print 实用程序生成性能分析器支持的各种显示内容的纯文本版本。输出显示标准输出中。实验文件是使用 collect 命令或 dbx collector 命令生成的。experiment-list 可包含实验名称或实验组名称。实验组由一个包含组中实验的名称的文件定义。可以通过以下方法读取子孙进程中的实验:通过显示引用这些实验,或者通过为这些实验构造实验组,如 collect (1) 手册页中所述。

根据收集的数据,可以为函数、调用方和被调用方、源文件以及反汇编列表计算各种性能度量。 collect (1) 手册页中对收集的数据和生成的度量进行了说明。性能分析器手册页中对可用的图形显示进行了说明。

Options

-script script

从每行包含一个命令的文件 script 中读取 er_print 命令。

-command

处理给定的命令。

-V

显示版本信息并退出。

选项按其出现顺序进行处理。选项可以重复。可按任何顺序混用脚本和显式命令。如果未提供任何命令或脚本参数,则 er_print 将进入交互模式以从输入终端读取命令。可以使用 quit 命令终止从输入终端的输入。

以 \ 结尾的任何行在解析之前都会将 \ 字符删除,并追加下一行的内容。对可使用的续行数没有限制(总内存除外)。包含空格的任何参数都必须用双引号 (") 引起来,无论是在命令行上,还是从脚本或从 .er.rc 文件读取。

处理每个命令后,会写入处理时出现的任何错误或警告消息。可以使用 procstats 命令输出有关处理的摘要统计信息。

对多个实验或实验组调用时,缺省情况下,er_print 将在聚集模式下开始。有关更多信息,请参见下文的“比较模式”部分。

Sub Commands

er_print 实用程序接受的命令如下所示。只要命令是明确的,就可以将其缩写为更短的字符串。

控制函数列表的命令

functions

使用当前度量集合写入函数列表。函数列表包括其函数使用 object_select 命令隐藏起来的所有装入对象。

metrics metric_spec

设置函数列表度量(相同的度量也用于源代码和反汇编代码以及行和 pc)。metric_spec 是度量关键字的冒号分隔列表。对于动态度量,即基于已测量数据的度量,每个关键字都采用 <flavor><visibility><metric-name> 的形式。对于静态度量,即基于实验中装入对象静态属性(名称、地址和大小)的度量,每个关键字都采用 [<visibility>]<metric-name> 的形式,<visibility> 设置是可选的。

<flavor> 可以是 "i"-表示非独占,也可以是 "e"-表示独占。组合 "ie" 和 "ei" 将进行扩展:例如,"ie<visibility><metric-name>" 将扩展为 "i<visibility><metric-name>:e<visibility><metric-name>"。

<visibility> 可以是 "."(将度量显示为时间)、"%"(将度量显示为百分比)和 "+"(将度量显示为计数)的任意组合。如果度量只能显示为时间或只能显示为计数,则 "." 和 "+" 具有相同的含义。对于硬件计数器分析实验和以周期计数的计数器,度量通常显示为时间 (".");如果在 <visibility> 字段中使用 "+",度量可以显示为计数。时间、百分比和计数出现的顺序是固定的:不受 <visibility> 设置中字符顺序的影响。对于静态度量,"+"、"." 和 "%" 全部具有相同的含义。

如果收集两个特定的计数器 "cycles" 和 "insts",则可以使用两个额外的度量,即 "CPI" 和 "IPC",分别表示每指令周期数和每周期指令数。它们始终以比率(而非时间、计数或百分比)的形式显示,无论通过 "+"、"." 还是 "%" 指定。高 CPI 值或低 IPC 值指示代码在计算机中运行效率低;相反,低 CPI 值或高 IPC 值指示代码在管道中运行效率高。

<visibility> 也可以指定为 "!",表示关闭度量。通常不使用它,但是在 dmetrics 命令(见下文)中使用它,用于设置缺省度量来覆盖每个度量类型的内置可见性缺省值。

同一度量不能在 metric_spec 中出现多次;如果出现多次,会将其报告为一个错误。如果度量 "name" 不在列表中,会将其附加到列表中。使用 metric_list 命令可以获取已装入实验的所有可用 <metric-name> 值的列表。有关度量的更多信息,请参见 collect (1) 手册页。

缺省情况下,使用的度量设置基于从 .er.rc 文件处理的 dmetrics 命令,如下文中缺省设置命令下所述。如果 metrics 命令将 metric_spec 显式设置为 default,则恢复适合已记录数据的缺省设置。重置度量时,会在新列表中设置缺省排序度量。如果省略了 metric_spec,则会输出当前度量设置。

除了为函数列表设置度量外,还可以为调用方-被调用方、数据派生输出和索引对象设置度量,以与度量设置匹配。调用方-被调用方度量显示以下归属的度量:它们对应于显示非独占或独占的度量的函数列表中的那些度量;同时还显示静态度量。

数据空间度量显示以下数据空间度量:这些度量有可用的数据并且对应于显示非独占或独占的度量的函数列表中的那些度量;同时还显示静态度量。

索引对象度量将显示以下索引对象度量:这些度量对应于显示非独占或独占的度量的函数列表中的那些度量;同时还显示静态度量。

如果 metrics 命令中存在错误,或者规范中没有任何度量对应于当前数据,将忽略该命令并发出警告,而使以前的设置保持有效。

sort metric_spec

按给定度量对函数列表进行排序。metric_specmetrics 下进行了介绍;它前面可以带有 "-" 符号,指定逆向排序。例如:

sort i.user

表示按非独占用户时间排序。度量名称中的 <visibility> 不影响排序顺序。如果在 metric_spec 中指定了多个度量,则使用第一个可见度量。如果指定的度量都不可见,则忽略该命令。

缺省情况下,使用的度量排序设置基于从 .er.rc 文件处理的 dsort 命令,如下文中缺省设置命令下所述。如果 sort 命令将 metric_spec 显式设置为 default,请使用缺省设置。

如果省略了 metric_spec,则会输出当前排序度量。

fsummary

按当前排序度量指定的顺序,为函数列表中的每个函数写入摘要面板。在函数列表中包括其函数使用 object_select 命令隐藏起来的所有装入对象。

fsingle function_name [N | ADDR]

为指定的函数写入摘要面板。在函数名称不明确的情况下,需要使用可选参数;有关更多信息,请参见 "source" 命令下的说明。

控制调用方-被调用方列表的命令

callers-callees

按函数排序度量 (sort) 指定的顺序,根据最后一个 metrics 规范,写入每个函数的调用方-被调用方面板。

csingle function_name [N | ADDR]

为指定的函数写入调用方-被调用方面板。在函数名称不明确的情况下,需要使用可选参数;有关更多信息,请参见 "source" 命令下的说明。

也可以为调用堆栈片段生成调用方-被调用方面板。片段中的初始帧由 csingl 命令设置。可以使用 cprependcappend 命令添加更多帧;可以使用 crmfirstcrmlast 命令删除帧。在调用堆栈片段中添加或删除每个帧后,将输出显示进入当前片段的所有调用方以及来自该片段的所有被调用方的面板。

cprepend function_name [N | ADDR]

将指定的函数置于当前调用堆栈片段前面。在函数名称不明确的情况下,需要使用可选参数;有关更多信息,请参见 "source" 命令下的说明。

cappend function_name [N | ADDR]

将指定的函数附加到当前调用堆栈片段。在函数名称不明确的情况下,需要使用可选参数;有关更多信息,请参见 "source" 命令下的说明。

crmfirst

从调用堆栈片段中删除顶部帧。

crmlast

从调用堆栈片段中删除底部帧。

控制调用树列表的命令

calltree

写入来自实验的动态调用图,显示每个级别的分层度量。

跟踪数据常用的命令

datasize

在对数刻度上写入跟踪数据中引用的数据大小的分布。对于堆跟踪,大小是分配或泄漏大小。对于 I/O 跟踪,大小是已传输的字节数。

duration

在对数刻度上写入跟踪数据中事件持续时间的分布。对于同步跟踪,持续时间是同步延迟。对于 I/O 跟踪,持续时间是 I/O 操作所用的时间。

控制泄漏和分配列表的命令

leaks

写入泄漏列表(按大小排序)以及每个泄漏的调用堆栈。按通用调用堆栈聚集泄漏列表中的条目。

allocs

写入分配列表(按大小排序)以及每个分配的调用堆栈。按通用调用堆栈聚集分配列表中的条目。

heap

写入按通用调用堆栈聚集的分配和泄漏的列表。

heapstat

写入堆使用情况的整体统计信息,包括应用程序的内存使用量峰值。

控制 I/O 活动报告的命令

ioactivity

写入所有 I/O 活动的报告,按文件排序。

iodetail

写入所有 I/O 活动的报告,按虚拟文件描述符排序。每次打开文件,系统都会生成一个不同的虚拟文件描述符,即使从打开的文件返回相同的文件描述符也是如此。

iocallstack

写入所有 I/O 活动的报告,按调用堆栈排序,并对调用堆栈相同的所有事件进行聚集。对于每个聚集的调用堆栈,包括调用堆栈跟踪。

iostat

写入所有 I/O 活动的摘要统计信息。

控制源代码和反汇编列表的命令

pcs

写入程序计数器 (program counter, PC) 及其度量的列表,按当前排序度量排序。包括列表中为使用 object_select 命令隐藏其函数的每个装入对象显示聚集度量的行。

psummary

按当前排序度量指定的顺序,为 PC 列表中的每个 PC 写入摘要度量面板。

lines

写入源代码行及其度量的列表,按当前排序度量排序。对于没有行号信息或其源文件未知的每个函数,在列表中包括显示聚集度量的行。还包括为使用 object_select 命令隐藏其函数的每个装入对象显示聚集度量的行。

lsummary

按当前排序度量指定的顺序,为行列表中的每个行写入摘要度量面板。

source { filename | function_name } [N | ADDR]

写入给定对象文件或者包含给定函数的对象文件的带注释的源代码。如果函数的名称是 C++ 函数或 Java 方法的名称,则可使用取消改编名称(短格式或长格式)或改编名称。如果改编名称包含空格,必须用双引号将其引起来。如果文件名或函数名称不明确,则需要使用可选参数 NADDR。如果使用了 N 形式,请选择第 N 个可能的选择(编号从 1 开始)。如果存在多种可能性,而提供的 N 未在可能的范围内,将报告一个错误;如果只有一种可能性,将忽略任何此类错误。

如果使用了 ADDR 形式,将写成 @segment-number:address。指定的 segment-number:address 值应该与它们显示为函数的地址度量时完全相同。

如果指定了不明确的名称而不带说明符,将输出选择的列表而非带注释的源代码的列表。每个列表项目都包含可用于 N 的数字、引用函数或文件的对象模块的名称,而且对于不明确的函数,还包含函数名称。

任何函数的缺省源上下文都被定义为该函数的第一条指令所归属的源文件。它通常是经过编译而生成包含该函数的对象模块的源文件。紧邻第一个指令之后,将添加函数的索引行。索引行显示为尖括号内的文本,其格式如下:

<Function: f_name>

替代源上下文由函数中的指令所归属于的其他文件组成。此类上下文包括来自包含文件的指令和来自内联到指定函数中的函数的指令。如果存在任何替代源上下文,则缺省源上下文的开头将包含扩展索引行列表,以指示替代源上下文所在的位置,格式如下:

<Function: f, instructions from source file src.h>

也可以将函数名称指定为 function`file`,其中 file 用于指定函数的替代源上下文。

注意:如果在命令行上调用 er_print 时使用了 -source 参数,则必须在 file 引号前加上反斜杠转义符。换句话说,函数名称将写成 function\`file\`。当 er_print 处于交互模式时,反斜杠不是必需的,也不应使用它。

通常,在使用缺省源上下文时,会显示源文件中所有函数的度量。如果源文件显式用作替代源上下文,则仅为指定的函数显示度量。

如果已选择任何编译器注释,请在源代码列表中交错显示注释与源代码行。在行中度量等于或超过文件中该度量最大值的阈值百分比的行前面加上字符串 "##",以便更轻松地找到重要行。使用源代码阈值设置 sthresh 和源代码编译器注释的首选项设置 scc 控制要显示的注释的阈值和类。

使用由 setpath 和/或 addpath 命令指定的搜索路径搜索文件。如果未找到文件,则在可执行文件中记录的绝对路径名下搜索。如果移动了源代码或者实验记录在不同的文件系统中,要放置一个从当前目录到实际源代码位置的符号链接,以便查看带注释的源代码,或者复制源代码并将对象装入实验。

src { filename | function_name } [N | ADDR]

source 相同。

disasm { filename | function_name } [N | ADDR]

写入给定对象文件或者包含给定函数的对象文件的带注释的反汇编代码。不明确的解决方法与在 source 命令中相同。

如果行中的度量值等于或超过该度量最大值的阈值百分比,则在行前面加上 "##"。这样可使您更轻松地找到重要行。阈值是使用 dthresh 命令设置的。显示的注释的类由 dcc 命令设置。

按照针对 source 命令所述搜索对应于指定的反汇编代码的源文件,并交错显示反汇编代码与源代码和索引行。如果函数包括来自替代源上下文的代码,则插入引用替代上下文的索引行,后跟不带编译器注释的原始反汇编代码。如果无法找到源文件,则显示不带源代码且不带编译器注释的反汇编代码。

scc com_spec

指定哪些编译器注释类与带注释的源代码一起显示。com_spec 是类的冒号分隔列表。每个类均指特定类型的消息。允许的类包括:

b[asic]

显示所有类的基本消息。

v[ersion]

显示版本消息。

w[arn]

显示警告消息。

pa[rallel]

显示并行化消息。

q[uery]

显示编译器的问题。

l[oop]

显示循环转换消息。

pi[pe]

显示流水线作业消息。

i[nline]

显示内联消息。

m[emops]

显示有关内存操作的消息。

f[e]

显示前端消息。

co[degen]

显示代码生成器消息。

cf

在源代码底部显示编译标志。

all

显示所有消息。

none

不显示消息。

类 "all" 和 "none" 不能与其他类一起使用。

为了实现兼容性,用于标记重要行的阈值可以包括在包含任何类(包括 "all" 和 "none")的列表中。

t[hreshold]=nn

如果某个行中的一个度量值大于文件中任何行上该度量的最大值的 nn%,则将该行标记为重要行。缺省值 nn 为 75。

例如:

scc l:pi:t=50

表示显示循环转换消息和流水线作业消息,并将阈值设置为 50%。

如果未指定 scc 命令,则使用缺省设置:

scc all

如果未指定 com_spec,则关闭编译器注释。scc 命令通常仅在 .er.rc 文件中使用。

sthresh value

设置用于在源代码中标记重要行的阈值。如果某个行中的一个度量值大于文件中任何行上该度量的最大值的 value%,则将该行标记为重要行。缺省值 value 为 75。

dcc com_spec

指定与带注释的反汇编代码一起显示的编译器注释类。该命令的 com_spec 规范可以包括任何 scc 类和以下附加规范:

h[ex]

显示每个指令的十六进制表示。

noh[ex]

不显示每个指令的十六进制表示。

s[rc]

在反汇编代码中交错显示源代码(缺省值)。

as[rc]

在反汇编代码中交错显示带注释的源代码(带有源代码行度量)。

nos[rc]

不在反汇编代码中交错显示源代码。

如果未指定 dcc 命令,则使用缺省设置:

dcc all:src

该命令通常仅在 .er.rc 文件中使用。

cc com_spec

指定源代码和反汇编代码的编译器注释。

dthresh value

设置用于在反汇编代码中标记重要行的阈值。如果某个行中的一个度量值大于文件中任何行上该度量的最大值的 value%,则将该行标记为重要行。缺省值 value 为 75。

控制搜索文件的命令

首先在实验的archives目录中查找装入对象文件。如果在该目录中未找到,则将使用与下面所述的源文件和对象文件相同的算法查找这些文件。

在大多数实验中,源文件和对象文件按照完整路径的格式记录。此外,Java 源文件还具有一个软件包名称,列出了文件的目录结构。在其他计算机上查看实验时,这些完整路径可能无法访问。

可以使用两个补充方法来查找源文件和对象文件:路径映射和搜索路径。(如果在归档子目录中未找到装入对象文件,则采用相同的方法查找这些文件。)

首先应用路径映射,并指定如何将任何完整文件路径中的前导部分替换为其他路径。例如,如果文件指定为:

/a/b/c/d/e/sourcefile

pathmap 指令可以指定将 /a/ 映射到 /x/y,或者指定将 /a/b/c/d/ 映射到 /x,等等。

如果通过路径映射找不到文件,则将使用搜索路径。搜索路径提供了一个要从中搜索具有指定基名的目录的列表(在上面的示例中,指定的基名为 sourcefile)。可以使用 setpath 命令设置搜索路径,也可以使用 addpath 命令附加到搜索路径。对于 Java 文件,将按该顺序尝试软件包名称和基名。

使用搜索路径中的每个目录来构造尝试搜索的完整路径。(对于 Java 源文件,将构造两个完整路径。)每个完整路径都会应用路径映射,如果没有任何映射的路径指向该文件,将尝试下一个搜索路径目录。

最后,如果这两种机制均未找到文件且没有路径映射前缀与原始完整路径匹配,则尝试原始完整路径。如果有任何路径映射前缀与原始完整路径匹配,但没有找到文件,则不会尝试原始完整路径。

请注意,缺省搜索路径包含当前目录 . 和实验目录,因此一个使源文件可访问的方法是将源文件复制到这些位置之一,或者在这些位置中放置指向源文件当前位置的符号链接。

pathmap old_prefix new_prefix

如果使用 addpathsetpath 设置的 path_list 无法找到文件,则可以提供一个或多个路径重映射。以 old_prefix 开头的源文件、对象文件或共享对象的任何路径名都会将该前缀替换为 new_prefix,生成的路径用于查找文件。可采用多个 pathmap 命令,并逐一尝试,直到找到文件为止。不带参数的 pathmap 指令将输出当前的路径映射列表。

setpath path_list

设置用于查找源文件、对象文件文件的搜索路径。path_list 是目录、jar 文件或 zip 文件的冒号分隔列表。如果任何目录中包含冒号字符,应使用反斜杠对其进行转义。特殊目录名称 $expts 引用当前实验集(按装入实验的顺序);可以将其缩写为单个 $ 字符。搜索 $expts 时,只查找创始实验;不检查任何子孙实验。

缺省搜索路径为:"$expts:."。如果通过搜索当前路径无法找到文件,请使用编译的完整路径名。

不带参数的 setpath 表示输出当前的路径。

setpath 命令可能不会显示在 .er.rc 文件中。

addpath path_list

path_list 附加到当前 setpath 设置。

addpath 命令可能会显示在 .er.rc 文件中,并且将会串联。

控制数据空间列表的命令

对于 Solaris x86 或 SPARC 系统上的精确计数器,数据空间命令仅适用于记录内存空间/数据空间数据的硬件计数器实验(缺省或显式)。有关更多信息,请参见 collect (1) 手册页。

数据空间数据仅可用于使用 -xhwcprof 标志编译的函数中发生的分析命中。-xhwcprof 标志适用于使用 C、C++ 和 Fortran 编译器进行编译,仅在 SPARC[R] 平台上有意义;在其他平台上将被忽略。有关详细信息,请参见编译器手册。

data_objects

写入数据对象及其度量的列表。

data_single

name [N] 写入指定数据对象的摘要度量面板。在对象名称不明确的情况下,需要使用可选参数 N

data_layout

为具有数据派生度量数据的所有程序数据对象写入带注释的数据对象布局,按整个结构的当前数据排序度量值排序。显示每个聚集的数据对象及归属于该对象的总度量,后跟按偏移顺序显示的所有元素,每个元素都有自己的度量和相对于 32 字节块的大小和位置指示符,其中:

<

元素与块完全契合。

/

元素启动一个块。

|

元素位于块内部。

\

元素表示块结束。

#

元素大小需要多个块。

X

元素跨多个块,但也可以放入一个块中。

?

未定义。

控制内存对象列表的命令

内存对象命令仅适用于缺省情况下在 X86 上针对精确计数器或者只在 SPARC Solaris 系统上针对非精确计数器指定了回溯的情况下记录了内存空间/数据空间数据的硬件计数器实验。有关更多信息,请参见 collect (1) 手册页。

内存对象是内存子系统中的组件,例如高速缓存行、页面、内存区。对象根据从记录的虚拟和/或物理地址计算的索引确定。为虚拟页面和物理页面预定义了内存对象,其大小为 8KB、64KB、512KB 和 4 MB。您可以使用 memobj_define 命令定义其他索引对象。

以下命令控制内存对象列表。

memobj mobj_type

使用当前度量写入给定类型的内存对象的列表。所用度量和排序方式与数据空间列表相同。也可以将名称 mobj_type 直接用作命令。

memobj_list | mobj_list

写入已知类型的内存对象的列表,用法与 memobj 命令中的 mobj_type 相同。

memobj_define | mobj_define mobj_typeindex_exp

通过将 VA/PA 映射到由 index_exp 提供的对象,定义新的内存对象类型。表达式的语法在下文“表达式语法”下进行了介绍。mobj_type 必须尚未定义,并且不能与任何现有命令或任何索引对象类型(见下文)匹配。其名称不区分大小写,必须完全由字母数字字符或 '_' 字符组成,且以字母字符开头。index_exp 必须在语法上是正确的。如果不正确,则将返回错误并忽略定义。如果 index_exp 包含任何空格,则必须用双引号 (") 将其引起来。<Unknown> 内存对象的索引是 -1,而且用于定义新内存对象的表达式应该支持识别 <Unknown>。例如,对于基于 VADDR 的对象,表达式应该采用以下格式:

VADDR>255?<expression>:-1

而对于基于 PADDR 的对象,表达式应该采用以下格式:

PADDR>0?<expression>:-1
memobj_drop mobj_type

丢弃给定类型的内存对象。

machinemodel model_name

按照指定计算机模型中的定义创建内存对象。model_name 是用户当前目录或用户主目录中的一个文件名,或者是在发行版中定义的计算机模型的名称。存储的计算机模型文件带有后缀 .ermm。如果 machinemodel 命令中的 model_name 不是以该后缀结尾,则将使用附加了 .ermmmodel_name。如果 model_name/ 开头,则假定它是绝对路径,并且将仅尝试该路径(如果需要,还会附加 .ermm)。如果 model_name 包含 /,将仅尝试相对于当前目录或用户主目录的路径名。

计算机模型文件可以包含注释和 mobj_define 命令。将忽略任何其他命令。machinemodel 命令可以出现在 .er.rc 文件中。如果已通过命令或通过读取其中记录了计算机模型的实验装入了计算机模型,则后续 machinemodel 命令将删除来自以前计算机模型的任何定义。

如果缺少 model_name,则输出所有已知计算机模型的列表。如果 model_name 是零长度字符串,则卸载装入的任何计算机模型。

控制索引对象列表的命令

索引对象命令适用于所有实验。索引对象是可通过从数据包的标头计算的公式建立索引的一类对象。可以为 "Threads"(线程)、"CPUs" (CPU)、"Samples"(抽样)和 "Seconds"(秒)等预定义索引对象。您可以使用 indxobj_list 命令获取完整列表。您可以使用 indxobj_define 命令定义其他索引对象。

以下命令控制索引对象列表。

indxobj indxobj_type

使用当前索引对象度量写入给定类型的索引对象的列表。所用度量和排序方式与函数列表相同,但是仅包含独占度量。也可以将名称 indxobj_type 直接用作命令。

indxobj_list

写入已知类型的索引对象的列表,用法与 indxobj 命令中的 indxobj_type 相同。

indxobj_define indxobj_type index_exp

通过将包映射到由 index_exp 提供的对象,定义新的索引对象类型。表达式的语法在下文“表达式语法”下进行了介绍。indxobj_type 必须尚未定义,并且不能与任何现有命令或任何内存对象类型(见上文)匹配。其名称不区分大小写,必须完全由字母数字字符或 '_' 字符组成,且以字母字符开头。index_exp 必须在语法上是正确的。如果不正确,则将返回错误并忽略定义。如果 index_exp 包含任何空格,则必须用双引号 (") 将其引起来。

用于 OpenMP 索引对象的命令

OMP_preg

输出在实验中执行的 OpenMP 并行区域及其度量的列表。此命令仅可用于含有 OpenMP 3.0 或 3.1 性能数据的实验。

OMP_task

输出在实验中执行的 OpenMP 任务及其度量的列表。此命令仅可用于含有 OpenMP 3.0 或 3.1 性能数据的实验。

控制线程分析器报告的命令

races

写入有关在实验中检测到的任何数据争用组的报告。数据争用报告只能从具有数据争用检测数据的实验获得。

rdetail [ race_id ]

写入有关指定数据争用的详细信息。如果将 race_id 指定为 all,则写入有关所有数据争用的详细信息。数据争用报告只能从具有数据争用检测数据的实验获得。

rsummary [ race_id ]

rdetail 相同。

deadlocks

写入有关在实验中检测到的任何死锁的报告。死锁报告只能从具有死锁检测数据的实验获得。

ddetail [ deadlock_id ]

写入有关指定死锁的详细信息。如果将 deadlock_id 指定为 all,则写入有关所有数据争用的详细信息。死锁报告只能从具有死锁检测数据的实验获得。

dsummary [ deadlock_id ]

ddetail 相同。

列出实验、抽样、线程和 LWP 的命令

experiment_list

显示已装入实验的列表。列出的每个实验都有一个索引(在选择抽样、线程或 LWP 时使用)和一个 PID(可在高级过滤时使用)。

sample_list

显示实验期间所处理样例的列表。

lwp_list

显示实验期间所处理 LWP 的列表。

thread_list

显示实验期间所处理线程的列表。

cpu_list

显示实验期间所使用的 CPU 的列表。

控制实验数据过滤的命令

有两种方式指定实验数据的过滤:一种是指定过滤器表达式,针对每个数据记录对该表达式求值来确定是否应该包括该记录;一种是使用早期的命令选择实验、样例、线程、CPU 和 LWP 进行过滤。

过滤条件表达式由以下命令控制。

filters filter_exp

filter_exp 是一个表达式,对于应该包括的任何数据记录,其计算结果为 true;对于不应包括的记录,其计算结果为 false。

filters 命令中表达式的语法在下文“表达式语法”下进行了介绍。如果表达式包含任何空格,则必须用双引号 (") 将其引起来。

describe

输出可用于生成过滤器表达式的标记列表。

以下旧式命令可选择为其显示数据进行过滤的实验、样例、线程、CPU 和 LWP。

sample_select sample_spec

sample_spec 是一个样例列表,如下所述。

lwp_select lwp_spec

lwp_spec 是一个 LWP 列表,如下所述。

thread_select thread_spec

thread_spec 是一个线程列表,如下所述。

cpu_select cpu_spec

cpu_spec 是一个 CPU 列表,如下所述。

上述每个列表都可以是一个数字、数字的范围 (n-m)、数字和范围的逗号分隔列表或者显式字符串 "all"。可以选择在每个列表前面加上类似格式的实验列表,用冒号 (:) 与列表分隔。多个列表可串联起来,用加号分隔。列表不得包含空格。如果不包括实验列表,则列表适用于所有实验。

将来自任何选择命令的实验选择应用于全部四种选择目标-线程、LWP、CPU 和样例。如果存在一系列线程、LWP、CPU 或样例,则保留实验列表中的每个实验;如果用户未指定任何实验,则选择所有实验。关闭未在实验列表中的实验的选择。

下面是一些示例:

thread_select 1

从所有实验中选择线程 1。

thread_select all:1

从所有实验中选择线程 1。

thread_select all:1,3,5

从所有实验中选择线程 1、3 和 5。

thread_select 1,2:all

从实验 1 和 2 中选择所有线程,如 exp_list 所列出。

thread_select 1:1+2:2

从实验 1 中选择线程 1,从实验 2 中选择线程 2。

控制装入对象函数展开/折叠的命令

object_show object1,object2,...

设置所有已命名的装入对象以显示其所有函数。对象的名称可以为全路径名或基名。如果名称包含逗号字符,则必须用双引号将名称引起来。如果使用字符串 all 命名装入对象,则显示所有装入对象的函数。

object_hide object1,object2,...

设置所有已命名的装入对象以隐藏其所有函数。对象的名称可以为全路径名或基名。如果名称包含逗号字符,则必须用双引号将名称引起来。如果使用字符串 all 命名装入对象,则显示所有装入对象的函数。

object_api object1,object2,...

设置所有已命名的装入对象以仅显示所有代表库入口点的函数。对象的名称可以为全路径名或基名。如果名称包含逗号字符,则必须用双引号将名称引起来。如果使用字符串 all 命名装入对象,则仅显示所有装入对象的入口点函数。

objects_default

按照 .er.rc 文件处理中的初始缺省值设置所有装入对象。

object_list

显示一个由两列组成的列表,包含全部装入对象的状态和名称。在第一列中显示 show/hide/api 状态,在第二列中显示名称。如果装入对象的函数显示在函数列表(已展开)中,则显示 show 状态;如果仅显示了表示装入对象入口点的函数,则显示 API-only 状态;如果函数未显示在函数列表(已折叠)中,则显示 hide 状态。已折叠装入对象的所有函数都映射到函数列表中表示整个装入对象的单个条目,或者如果仅显示那些表示装入对象入口点的函数,则映射到 API-only

object_showobject_hideobject_api 命令以遇到的顺序进行处理,任何后续命令都将覆盖该装入对象(或所有装入对象)以前的任何命令。

object_select object1,object2,...

设置活动装入对象的列表。显示所有指定装入对象的函数,隐藏所有其他装入对象的函数。对象的名称可以为全路径名或基名。如果名称包含逗号字符,则必须用双引号将名称引起来。

如果显示某个装入对象的函数,则在函数列表中显示具有非零度量的所有函数。如果隐藏某个装入对象的函数,则会折叠其函数,并且仅显示包含整个装入对象的度量的单个行,而不是显示其各个函数。

缺省情况下,显示所有装入对象的函数,但 <Unknown> 对象除外。

列出度量的命令

metric_list

显示当前选定的函数列表度量以及可用于在其他命令(例如 sort)中引用它们的度量和关键字名称的列表。度量关键字的格式在 metrics 下进行了介绍。可用度量取决于收集的数据。请参见 collect (1) 手册页。

cmetric_list

显示当前选定的调用方-被调用方度量以及调用方-被调用方报告的度量和关键字名称的列表。以与 metric_list 输出相同的方式显示列表,但是另外包括归属度量。

data_metric_list

显示当前选定的数据派生度量以及所有数据派生报告的度量和关键字名称的列表。以与 metric_list 输出相同的方式显示列表,但是仅包括那些具有数据派生类型的度量和静态度量。

indx_metric_list

显示当前选定的索引对象度量以及所有索引对象报告的度量和关键字名称的列表。以与 metric_list 输出相同的方式显示列表,但是仅包括那些具有独占类型的度量和静态度量。

控制输出的命令

outfile filename

关闭任何打开的输出文件,然后为后续输出打开 filename。打开 filename 时,将清除任何先前已存在的内容。如果 filename 是减号 (-),则将输出写入 stdout。如果 filename 是一对减号 (-),则将输出写入 stderr

appendfile filename

关闭任何打开的输出文件并打开 filename,保留任何先前存在的内容,以便将后续输出附加到文件的结尾。如果 filename 不存在,则 appendfile 的功能与 outfile 相同。

limit n

将任何输出限制为报告中的前 n 个条目,其中 n 是一个无符号整数。如果 n 为零,则删除所有限制。如果省略了 n,则会输出当前限制。

name { long | short | mangled } [:{soname | nosoname }]

使用 longshort 格式的 C++ 函数名称。如果指定了 soname,则将共享对象名称附加到函数名称。

viewmode { user | expert | machine }

将查看模式设置为 userexpertmachine

对于 Java 实验,用户模式显示 Java 线程的 Java 调用堆栈,而不显示内务处理线程。函数列表包括函数 <JVM-System>,该函数表示来自非 Java 线程的聚集时间。当 JVM 软件不报告 Java 调用堆栈时,将根据函数 <no Java callstack recorded> 报告时间。在执行 Java 代码时,专家模式将显示 Java 线程的 Java 调用堆栈,而在执行 JVM 代码或 JVM 软件不报告 Java 调用堆栈时,专家模式将显示计算机调用堆栈。将显示非用户 Java(内务处理)线程的计算机调用堆栈。计算机模式显示所有线程的计算机调用堆栈。

对于 OpenMP 实验,用户模式显示重构的调用堆栈,这些重构的调用堆栈类似于在不使用 OpenMP 的情况下编译程序时获取的调用堆栈。

专家模式显示编译器生成的表示并行化循环、任务等的函数,这些函数会与用户模式下的用户函数聚集。在这两种模式下,当 OpenMP 运行时执行某些操作时,将显示名称格式为 <OMP-*> 的特殊函数。来自 OpenMP 运行时代码 (libmtsk.so) 的函数将被禁止。

在计算机模式下,将显示捕获的实际本机堆栈。

对于所有其他实验,所有三种模式显示同样的数据。

compare [on|off|delta|ratio]

将比较模式设置为关闭(compare off,缺省值)、开启 (compare on)、增量 (compare delta) 或比率 (compare ratio)。如果比较模式为关闭,则读取多个实验时将聚集数据。如果启用比较,则装入多个实验时,将为每个实验的数据显示单独的度量列。如果比较模式为增量,则基实验显示绝对度量,但是比较实验显示其与基实验之间的差异。如果比较模式为比率,则比较实验显示其与基实验之间的比率。

比较模式将每个实验或实验组视为单独的比较组。第一个实验或实验组参数是基本组。如果您希望在一个比较组中包括多个实验,则必须创建实验组文件以用作 er_print 的单个参数。

printmode string

基于 string 设置输出模式。如果 stringtext,输出将按以前版本中的方式执行-表格形式。如果 string 是一个字符,输出将作为分隔符分隔的列表执行,这一个字符作为分隔符。如果 stringhtml,输出将采用 HTML 表的格式。其他任何 string 均无效,将忽略该命令。

printmode 设置仅用于生成表的命令(functionsmemobjindxobj etc.);对于其他输出命令,将忽略该设置。

输出其他信息的命令

header [ exp_id ]

写入有关指定实验的描述性信息。exp_idexperiment_list 命令指定的实验的数字标识符。如果 exp_idall 或被省略,则写入所有实验的标头。在每个标头后,将输出任何错误或警告。由一行短划线分隔每个实验的标头。

如果实验目录包含名为 notes 的文件,则将该文件的内容添加到标头信息之前。

objects

列出装入对象以及由于使用装入对象而产生的任何错误或警告消息以用于性能分析。

overview

写入对所有实验汇总的所有数据的概述。使用 [X] 指示函数列表度量,而常用度量具有星号来突出显示其值。

sample_detail [ exp_id ]

写入有关指定实验的详细样例信息。exp_idexperiment_list 命令指定的实验的数字标识符。如果 exp_id 被省略或为 all,则写入所有实验中所有样例的总和与统计信息。

现在由 sample_detail 生成的报告过去使用 overview 命令输出。

statistics [ exp_id ]

写入有关指定实验的执行统计信息数据,对当前的样例集聚集数据。exp_idexperiment_list 命令指定的实验的数字标识符。如果省略了 exp_id,则写入按样例选择的所有实验的总和。如果 exp_idall,则写入每个实验中选定样例的总和与统计信息。

ifreq

写入指令执行摘要。指令频率报告只能从具有计数数据的实验获得。

用于实验的命令

以下命令仅在脚本中和交互模式下使用,而不允许在命令行上使用。

add_exp exp_name

将指定的实验或实验组添加到当前会话。

drop_exp exp_name

从当前会话中丢弃指定的实验。

open_exp exp_name

从会话中丢弃装入的所有实验,然后装入指定的实验或实验组。

缺省设置命令

er_print 实用程序和 er_src 实用程序中的许多报告以及分析器中显示内容的缺省值可以在名为 .er.rc 的资源文件中设置。er_print 实用程序和性能分析器都先处理系统范围的 .er.rc 文件,然后处理主目录中的 .er.rc 文件(如果存在),再处理当前目录中的 .er.rc 文件(如果存在)。从每个文件中读取的指令优先于以前读取的指令。

注意:由于分析器、er_print 实用程序和 er_src 实用程序的缺省值全部由通用 .er.rc 文件设置,因此 er_print 实用程序的输出受在分析器的 "Set Data Presentation"(设置数据显示)对话框中保存更改或受使用任何编辑器更改 .er.rc 文件的影响。

分析器将消息放入指定它处理的用户 .er.rc 文件的错误/警告日志区域。er_print 实用程序和 er_src 实用程序将消息输出到指定这些文件的 stderr。

这些文件可包含 sccsthreshdccdthreshaddpathpathmapnamemobj_defineindxobj_defineobject_showobject_hideobject_apicompareprintmodemachinemodelviewmode 命令,如上所述。它们也可包含以下命令,这些命令不能用在命令行上或脚本中:

dmetrics metric_spec

指定度量的缺省顺序和可见性。可以在任何 .er.rc 文件中指定多个 dmetrics 命令,这些命令将串联起来。来自多个文件的 dmetrics 设置将按以下顺序串联起来:当前目录、主目录和系统。

metric_spec 在上述 metrics 命令下进行了介绍,下面是一些补充:

<visibility> 可以是 "!",它表示没有任何版本的度量是可见的。这允许您指定度量的顺序而无需使其在缺省情况下可见。

可以指定两个通用度量名称。"hwc" 表示任何硬件计数器度量,"any" 表示任何度量。

对于从已装入的实验计算的所有度量,将扫描所有 dmetrics 的串联列表查找匹配项。第一个匹配条目可确定函数列表和调用方-被调用方列表中度量的可见性和顺序。

dsort metric_spec

指定缺省情况下用于对函数列表排序的度量。与实验中任何度量匹配的 dsort 规范中的第一个度量用于确定排序度量,且受到以下条件的限制。如果 dsort metric_spec 中条目的 <visibility> 为 "!",将使用名称匹配的第一个度量,而不管其是否可见;如果使用 <visibility> 的其他任何设置,将使用名称匹配的第一个可见度量。与 dmetrics 一样,来自多个 .er.rc 文件的 dsort 规范也按以下顺序串联起来:当前目录、主目录和系统。

en_desc option

根据 option 设置读取子孙实验的模式。option 的允许值包括:

on

显示有关子孙进程的所有实验(缺省值)

off

不显示有关子孙进程的任何实验

=<regex>

显示有关沿袭或可执行文件名称与正则表达式匹配的子孙进程的实验。

如果已装入的任何实验的子孙不是由于 en_desc 设置装入的,则将从 er_print 中输出一条消息,并从性能分析器中打开一个弹出式窗口。

其他命令

procstats

输出处理数据的累积统计信息。

script script

从指定的脚本处理命令。

version

输出 er_print 的当前发行版版本。

quit

退出交互模式。如果在脚本中使用,将不再处理来自该脚本的命令。

exit

quit 的别名。

help

输出帮助信息。

# ...

注释行;在脚本或 .er.rc 文件中使用。

表达式语法

表达式语法

定义过滤器的表达式和用于计算内存对象索引的表达式使用通用语法。

语法将表达式指定为运算符和操作数的组合。对于过滤器,如果表达式的计算结果为真,则包括包;如果表达式的计算结果为假,则排除包。对于内存对象,表达式的计算结果为一个索引,该索引定义包中引用的特定内存对象。

表达式中的操作数是常量或数据记录中的字段,如使用 describe 命令所列出。这些操作数包括 THRID、LWPID、CPUID、USTACK、XSTACK、MSTACK、LEAF、VIRTPC、PHYSPC、VADDR、PADDR、DOBJ、TSTAMP、SAMPLE、EXPID、PID 或内存对象的名称。操作数名称不区分大小写。

USTACK、XSTACK 和 MSTACK 分别表示用户视图、专家视图和计算机视图中的函数调用堆栈。

仅当为硬件计数器分析或时钟分析指定了 "+" 时,VIRTPC、PHYSPC、VADDR 和 PADDR 才是非零值。此外,当无法确定实际虚拟地址时,VADDR小于 256。如果无法确定 VADDR 或者无法将虚拟地址映射到物理地址,则 PADDR 为零。同样,如果回溯失败或者未请求回溯,VIRTPC为零;如果VIRTPC为零或者无法将VIRTPC映射到物理地址,PHYSPC为零。

运算符包括常见的逻辑运算符和算术(包括移位)运算符(在 C 表示法中,具有 C 优先级规则),以及用于确定某个元素是否位于集中的运算符 (IN) 或用于确定某组元素中的任一元素或全部元素是否包含在集中的运算符(分别对应 SOME IN 或 IN)。附加运算符ORDERED IN用于确定左侧操作数中的所有元素是否以相同的顺序出现在右侧操作数中。注意,IN 运算符要求左侧操作数中的所有元素出现在右侧操作数中,但对顺序未作要求。按照 C 语言中的方式指定 If-then-else 结构(使用?和:运算符)。应该使用圆括号以确保正确解析所有表达式。在 er_print 命令行上,不能将表达式拆分为多行。在脚本中或命令行上,如果表达式包含空格,则必须用双引号将其引起来。

过滤表达式的计算结果为布尔值。如果应该包括包,则计算结果为真,如果不应该包括包,则计算结果为假。线程、TWP、CPU、实验 id、进程 pid 和样例过滤基于相应关键字和整数之间的关系表达式,或者使用 IN 运算符和逗号分隔的整数列表。

可通过在TSTAMP和时间(以整数纳秒为单位,从将要处理其包的实验开始时算起)之间指定一个或多个关系表达式来使用时间过滤。通过 sample_detail 命令可以获取样例的时间;sample_detail 命令中的时间以秒为单位指定,必须转换为纳秒才能进行时间过滤。时间还可以从分析器的“时间线”显示获得。

函数过滤可以基于叶函数或堆栈中的任何函数。按叶函数进行过滤是通过 LEAF 关键字和整型函数 id 之间的关系表达式指定的,或者使用 IN 运算符和构造 FNAME("<regex>") 指定,其中 <regex> 是正则表达式,如 regex(5) 手册页中所指定的那样。函数的整个名称(如 name 的当前设置所指定)必须匹配。

根据调用堆栈中的任何函数进行过滤是通过确定构造 FNAME("<regex>") 中是否有任何函数在关键字 USTACK 表示的函数数组中指定的:

(FNAME("myfunc") SOME IN USTACK)

数据对象过滤类似于堆栈函数过滤,使用 DOBJ 关键字和构造 DNAME("<regex>")(括在圆括号中)。

内存对象过滤是使用内存对象的名称(如 mobj_list 命令中所示)和对象的整型索引或对象集的索引来指定的。(<Unknown> 内存对象的索引是 -1。)

数据对象过滤和内存对象过滤仅对具有内存空间/数据空间数据的硬件计数器包有意义;此类过滤将排除所有其他包。

虚拟地址或物理地址的直接过滤是通过 VADDR 或 PADDR 与地址之间的关系表达式指定的。

内存对象定义(mobj_define 命令)使用计算结果为整型索引的表达式(使用 VADDR 关键字或 PADDR 关键字)。它们仅适用于内存计数器和内存空间/数据空间数据的硬件计数器包。该表达式应该返回整数,对于 <Unknown> 内存对象,则返回 -1。

示例过滤器表达式

当线程 1 仅在 CPU 2 上运行时,要查看线程 1 中的事件,请使用:

THRID == 1 && CPUID == 2

如果索引对象 THRCPU 定义为 "CPUID<<16|THRID",以下过滤器等效于以上过滤器:

THRCPU == 0x10002

过滤介于第 5 秒和第 9 秒之间的时间段中发生的实验 2 的事件:

EXPID==2 && TSTAMP >= 5000000000 && TSTAMP < 9000000000

过滤堆栈中具有特定 Java 类的任何方法的事件(用户视图模式下):

FNAME("myClass.*") SOME IN USTACK

已知函数 ID(例如,在分析器 GUI 中)时,过滤包含计算机调用堆栈中特定调用序列的事件:

(314,272) ORDERED IN MSTACK

如果 describe 命令列出时钟分析实验的以下属性:

MSTATE    UINT32  Thread state
NTICK     UINT32  Duration

则您可以指定一个过滤器以保留处于特定状态的事件:

MSTATE == 1

如果要过滤一定持续时间内的事件:

MSTATE == 1 && NTICK > 1

比较模式

比较模式

对多个实验或实验组调用 er_print 时,将聚集数据。如果使用 compare 命令启用比较,函数列表将针对每个实验或实验组显示单独的度量列,以便比较数据。

兼容性

兼容性

er_print 只能用于使用最新版本的工具记录的实验。对于使用其他任何版本记录的实验,分析器将报告错误。您应该使用记录实验时所用发行版中的 er_print 版本。

See also

analyzer (1) 、 collect (1) 、 collector (1) 、 dbx (1) 、 er_archive (1) 、 er_cp (1) 、 er_export (1) 、 er_mv (1) 、 er_rm (1) 、 er_src (1) 、 tha (1) 、 libcollector (3) 、 regex (5)

性能分析器手册