Go to main content

手册页部分 1:用户命令

退出打印视图

更新时间: 2022年7月27日 星期三
 
 

gprof(1)

名称

gprof - 显示调用图配置文件数据

用法概要

gprof [-abcCDlsVz] [-e function-name] [-E function-name] 
     [-f function-name] [-F function-name] 
     [image-file [profile-file...]] 
     [-n number of functions]

描述

gprof 实用程序会生成程序的执行配置文件。有效的已调用例程会并入每个调用者的配置文件中。配置文件数据取自使用 cc(1) 的 –xpg 选项编译的程序所创建的、或使用其他编译器的 –pg 选项所创建的、或通过为共享目标文件设置 LD_PROFILE 环境变量所创建的调用图配置文件文件。请参见 ld.so.1(1)。这些编译器选项同样链接进行了编译以供分析的库例程版本。可执行映像文件 image-file(缺省情况下为 a.out)中的符号表已读取并与调用图配置文件 profile-file(缺省情况下为 gmon.out)关联。

首先,每个例程的执行时间会沿调用图的边缘传播。将会对周期进行搜索,且周期中的调用会分享周期时间。第一个列表显示了根据函数所代表时间(包括其调用图子孙的时间)排序的函数。每个函数条目下会显示其(直接)调用图子项以及其时间传播到此函数的方式。函数上的类似显示说明了函数的时间及其子孙的时间传播到其(直接)调用图父项的方式。

同时显示了周期(周期及其条目为一个整体),也提供了周期成员列表及其时间构成和周期的调用计数。

接下来提供了平面配置文件,与 prof(1) 所提供的类似。此列表提供了程序中每个函数的总执行时间和调用计数,以递减时间排序。最后提供了一个索引,显示了函数名称和调用图配置文件索引编号之间的对应关系。

可通过 MARK 宏将单个函数拆分为子函数进行分析。请参见 prof(7)

请注意量化错误。虽然显示了抽样粒度,但这是最理想情况下的统计。假设每次执行函数的时间可通过函数的总时间除以函数被调用的次数来表示。因此沿调用图 arc 传播到该函数父项的时间直接与 arc 遍历的次数成正比。

分析的程序必须调用 exit(2) 或为保存在 gmon.out 文件中的分析信息正常返回。

选项

支持以下选项:

–a

禁止输出静态声明函数。如果给出了此选项,则关于静态函数(如时间样本、对其他函数的调用和来自其他函数的调用)的所有相关信息都属于在 a.out 文件中静态函数前装入的函数。

–b

简要。禁止配置文件中每个字段的说明。

–c

使用可检查目标文件文本空间的试探性操作来搜索程序的静态调用图。仅静态父项或子项通过调用计数 0 来指定。请注意,对于动态链接的可执行文件,不会检查链接的共享目标文件的文本段。

–C

取消改编 C++ 符号名称后再将其输出出来。

–D

生成一个配置文件 gmon.sum,可表示所有指定配置文件中配置文件信息的差异。此摘要配置文件可能提供给 gprof 的后续执行(同样使用 –D)以在 a.out 文件多次运行间总结配置文件数据。另请参见 –s 选项。

例如,假设函数 A 在配置文件 gmon.sum 中调用函数 B n 次,在配置文件 gmon.out 中调用函数 B m 次。使用 –D 可创建一个新 gmon.sum 文件,该文件会将从 A 到 B 的调用数量显示为 n-m

–efunction-name

禁止为例程 function-name 及其所有子孙输出图配置文件条目(除非它们拥有其他未被禁止的祖先)。可能提供一个以上的 –e 选项。每个 –e 选项可能仅提供一个 function-name

–Efunction-name

禁止为例程 function-name(及其子孙)将图配置文件条目输出为以下的 –e,在 function-name(及其子孙)中花费的时间也不会包含在计算的总时间和时间百分比中。可能提供一个以上的 –E 选项。例如:

–E mcount –E mcleanup

是缺省值。

–ffunction-name

仅为例程 function-name 及其子孙列显图配置文件条目。可能提供一个以上的 –f 选项。每个 –f 选项可能仅提供一个 function-name

–Ffunction-name

仅为例程 function-name 及其子孙列显图配置文件条目(如下方的 –f),同样,且仅将列显的例程时间用于计算的总时间和百分比。可能提供一个以上的 –F 选项。每个 –F 选项可能仅提供一个 function-name–F 选项优先于 –E 选项。

–l

禁止为所有局部符号报告图配置文件条目。该选项等同于将指定可执行映像的所有局部符号置于 –E 排除列表上。

–n

将平面配置文件和图配置文件列表的大小限制在头 n 个违例函数。

–s

生成一个配置文件 gmon.sum,可表示所有指定配置文件中配置文件信息的总和。此摘要配置文件可能提供给 gprof 的后续执行(同样使用 –s)以在 a.out 文件多次运行间累积配置文件数据。另请参见 –D 选项。

–V
–-version

输出版本信息并立即退出。

–z

显示使用为零的例程(由调用计数和累积的时间表示)。该选项可与 –c 选项结合使用,以搜索从未被调用的例程。请注意,动态链接的可执行文件的使用受限,因为 –c 选项不会检查共享目标文件文本空间。

–?
–-help

输出用法消息并立即退出。

环境变量

PROFDIR

如果此环境变量包含一个值,那么请将该目录中的分析输出置于名为 pid. programname 的文件中。pid 是进程 ID 且 programname 是正在进行分析的程序的名称,由从调用程序的 argv[0] 中删除任意路径前缀所确定。如果变量包含空值,则不会生成分析输出。否则,分析输出将置于文件 gmon.out 中。

文件

a.out

包含名称列表的可执行文件

gmon.out

动态调用图和配置文件

gmon.sum

汇总的动态调用图和配置文件

$PROFDIR/pid.programname

属性

有关下列属性的说明,请参见 attributes(7)

属性类型
属性值
可用性
developer/base-developer-utilities

另请参见

cc(1), ld.so.1(1)prof(1)exit(2)pcsample(2)profil(2)malloc(3C)monitor(3C)malloc(3MALLOC)attributes(7)prof(7)

Graham、S.L.、Kessler、P.B.、McKusick 和 M.K.合著的《gprof: A Call Graph Execution Profiler Proceedings of the SIGPLAN '82 Symposium on Compiler Construction》,SIGPLAN 声明,第 17 卷,第 6 号,第 120-126 页,1982 年 6 月出版。

Oracle Solaris 11.4 Linkers and Libraries Guide

附注

如果已经删除了可执行映像,且该映像没有 .symtab 符号表,那么 gprof 会读取全局动态符号表 .dynsym.SUNW_ldynsym(如果存在)。动态符号表中的符号是 .symtab 中找到的符号的子集。.dynsym 符号表包含运行时链接程序所使用的全局符号。.SUNW_ldynsym 使用本地函数符号扩充了 .dynsym 中的信息。如果找到 .dynsym 而没有找到 .SUNW_ldynsym,则只有全局符号信息可用。如果没有本地符号,则行为如 –a 选项所述。

当编译程序进行分析时,LD_LIBRARY_PATH 不得包含 /usr/lib 作为组件。如果 LD_LIBRARY_PATH 包含 /usr/lib,则程序将无法正确链接至 /usr/lib/libp 中系统库的分析版本。

因为与其他进程的共享缓存所产生的不同高速缓存命中率,连续相同的运行所报告的次数可能不同。即使程序看上去是使用计算机的唯一方,隐藏后台或异步进程也可能干扰数据。在少数情况下,启动程序计数器记录的时钟周期可能使用程序中的循环计数,这将严重扭曲计量数值。但调用计数始终可精确记录。

仅调用 exit 的程序或从 main 返回的程序能保证生成配置文件,除非对 monitor 的最终调用可显式编码。

mcount()_mcount()moncontrol()_moncontrol()monitor()_monitor() 等函数可能出现在 gprof 报告中。这些函数是分析实现的一部分,所以会考虑一定数量的运行时开销。因为这些函数不会出现在未分析的应用程序中,所以评估应用程序性能时,会忽略这些函数的累积时间和调用计数。

64 位分析

64 位分析可自由用于动态链接的可执行文件,且如果编译目标文件进行分析,则可为共享目标文件收集分析信息。解释配置文件输出时必须小心,因为来自不同共享目标文件的符号可能拥有相同名称。如果在配置文件输出时发生重名现象,则可通过符号索引列表中符号名称之前的模块 ID 前缀来为符号确定相应模块。

使用 –s–D 选项来总结多个配置文件时必须小心,不要将 32 位配置文件与 64 位配置文件混用。

32 位分析

32 位分析可用于动态链接的可执行文件,但必须谨慎。在 32 位分析中,不能使用 gprof 来分析共享目标文件。因此,执行分析的动态链接程序时,只会抽样映像的主要部分。这意味着在主要目标文件之外花费的所有时间,即针对共享目标文件所花费的时间,都不会包括在配置文件摘要中;针对程序报告的总时间可能少于程序使用的总时间。

因为不会考虑在共享目标文件上所花费的时间,所以在使用 gprof 分析程序时,应该尽可能少地使用共享目标文件。如果需要,程序应该链接到库的分析版本(如果没有分析版本,则链接到标准归档版本)而不是共享目标文件,以获取关于库函数的配置文件信息。分析库版本可能由系统在 /usr/lib/libp 目录中提供。请参阅编译器驱动程序文档获取分析信息。

需要考虑极端情况。与共享 C 库动态链接的分析程序在某些 libc 例程中会花费 100 个时间单位,如 malloc()。假设 malloc() 仅从例程 B 中被调用,且 B 仅消耗 1 个时间单位。进一步假设例程 A 消耗 10 个时间单位,超过映像主要(分析)部分中的任何其他例程。在此情况下,gprof 将推断,大部分时间花费在 A 中,几乎没有在 B 中花费时间。基于此,几乎不可能得出,可通过查看例程 B 而不是例程 A 来获取最大提升。以上情况中分析器的值严重退化;解决方案是尽可能多地使用归档进行分析。

已知问题

自己没有分析的父项将拥有传播到自身的分析子项的时间,但它们看上去是在调用图列表中自发调用的,且不会进一步传播它们的时间。与此类似,信号捕捉器即使经过分析,看上去也是自发调用的(尽管原因更加复杂)。任何信号捕捉器的分析子项都应该正确传播其时间,除非信号捕捉器是在执行分析例程期间调用的,在此情况下,所有时间都会丢失。