prof - 显示配置文件数据
prof [-ChsVz] [-a | c | n | t] [-o | x] [-g | l] [-m mdata] [prog]
prof 命令解释由 monitor 函数生成的配置文件。读取目标文件 prog(缺省情况下为 a.out)中的符号表,并将其与配置文件(缺省情况下为 mon.out)关联。对于每个外部文本符号,将输出执行该符号地址与执行下一个符号地址之间所花费的时间百分比,以及调用函数的次数和每次调用平均花费的毫秒数。
互斥选项 –a、–c、–n 和 –t 确定输出行排序类型:
按符号地址增序排序。
按调用数降序排序。
从词汇方面按符号名称排序。
按总时间百分比降序排序(缺省)。
互斥选项 –o 和 –x 指定监视的每个符号的地址输出:
列显每个符号地址(八进制)及符号名称。
列显每个符号地址(十六进制)及符号名称。
互斥选项 –g 和 –l 控制要报告的符号类型。请慎用 –l 选项;应用继续执行(内存中)的全局函数的静态函数时花费的时间,而不是在报告中为静态函数提供单独的条目。如果正确找到所有静态函数,此功能可能会非常有用。如果不是,生成的报告可能会造成误导。
假设 A 和 B 为全局函数,并且仅 A 调用静态函数 S。如果 S 紧跟在源代码中的 A 后(即如果正确找到 S),则使用 –l 选项可轻松确定 A 花费的时间量,包括 S 花费的时间。但是,如果 A 和 B 调用 S,并且使用了 –l 选项,报告将会造成误导;B 调用 S 期间花费的时间将归入 A,这样 A 所花费的时间看起来会比实际花费的时间多。在这种情况下,将不能正确找到函数 S。
单独列出静态(非全局)函数花费的时间。–g 选项函数与 –l 函数相反。
禁止输出静态声明函数。如果提供此选项,则会将在静态函数中执行花费的时间分配给位于可执行文件静态函数前最近的全局函数。此选项为缺省选项。这与 –g 函数相反,应谨慎使用。
以下选项可按任何组合形式使用:
取消改编 C++ 符号名称后再将其输出出来。
禁用通常在报告上输出的标题。如果要进一步处理报告,则这非常有用。
使用文件 mdata 而非 mon.out 作为输入配置文件。
在标准错误输出中列显若干监视参数和统计信息的摘要。
输出版本信息。
包含配置文件范围内的所有符号,即使与调用的零数字和零时间关联也是如此。
输出用法消息并立即退出。
可通过 MARK 宏将单个函数拆分为子函数进行分析。请参见 prof(7)。
分析程序创建的文件的名称由环境变量 PROFDIR 控制。如果未设置 PROFDIR,程序终止时将在当前目录中生成 mon.out。如果 PROFDIR= string,则生成 string/pid.progname,其中 progname 包含 argv[0](已删除所有路径前缀),而 pid 是程序的进程 ID。如果设置 PROFDIR 但为空值,则不会生成任何分析输出。
缺省配置文件
缺省名称列表(目标)文件
有关下列属性的说明,请参见 attributes(7):
|
gprof(1)、exit(2)、pcsample(2)、profil(2)、malloc(3C)、monitor(3C)、malloc(3MALLOC)、attributes(7)、prof(7)
如果已经删除了可执行映像,且该映像没有 .symtab 符号表,那么 gprof 会读取全局动态符号表 .dynsym 和 .SUNW_ldynsym(如果存在)。动态符号表中的符号是 .symtab 中找到的符号的子集。.dynsym 符号表包含运行时链接程序所使用的全局符号。.SUNW_ldynsym 使用本地函数符号扩充了 .dynsym 中的信息。如果找到 .dynsym 而没有找到 .SUNW_ldynsym,则只有全局符号信息可用。如果没有本地符号,则行为如 –a 选项所述。
因为与其他进程的共享缓存所产生的不同高速缓存命中率,连续相同的运行所报告的次数可能不同。即使程序看上去是使用计算机的唯一方,隐藏后台或异步进程也可能干扰数据。在少数情况下,启动程序计数器记录的时钟周期可能使用程序中的循环计数,这将严重扭曲计量数值。但调用计数始终可精确记录。
仅调用 exit 的程序或从 main 返回的程序能保证生成配置文件,除非对 monitor 的最终调用可显式编码。
如果不使用 –g 选项,则静态函数时间归于前面的外部文本符号。但是,前面函数的调用计数仍然正确;即不会将静态函数调用计数添加到外部函数的调用计数。
如果指定 –t、–c、–a 和 –n 选项中的多个,则使用最后指定的选项,并会向用户发出警告。
当编译程序进行分析时,LD_LIBRARY_PATH 不得包含 /usr/lib 作为组件。如果 LD_LIBRARY_PATH 包含 /usr/lib,则程序将无法正确链接至 /usr/lib/libp 中系统库的分析版本。请参见 gprof(1)。
mcount()、_mcount()、moncontrol()、_moncontrol()、monitor() 和 _monitor() 等函数可能出现在 prof 报告中。这些函数是分析实现的一部分,所以会考虑一定数量的运行时开销。因为这些函数不会出现在未分析的应用程序中,所以评估应用程序性能时,会忽略这些函数的累积时间和调用计数。
64 位分析可自由用于动态链接的可执行文件,且如果编译目标文件进行分析,则可为共享目标文件收集分析信息。解释配置文件输出时必须小心,因为来自不同共享目标文件的符号可能拥有相同名称。如果在配置文件输出中发现重复名称,最好使用 –s(摘要)选项,从而在每个重复的符号前添加模块 ID 前缀。然后,可通过在摘要中查看模块信息将符号映射到相应的模块。
如果将 –a 选项与动态链接的可执行文件一起使用,将基于每个共享目标文件进行排序。由于其他共享目标文件中的符号很可能具有相同的值,这会使输出更加易于理解。如果提供 –s 选项,空行将分隔不同共享目标文件的符号。
32 位分析可用于动态链接的可执行文件,但必须谨慎。在 32 位分析中,不能使用 prof 来分析共享目标文件。因此,执行分析的动态链接程序时,只会抽样映像的主要部分。这意味着在主要目标文件之外花费的所有时间,即针对共享目标文件所花费的时间,都不会包括在配置文件摘要中;针对程序报告的总时间可能少于程序使用的总时间。
因为不会考虑在共享目标文件上所花费的时间,所以在使用 prof 分析程序时,应该尽可能少地使用共享目标文件。如果需要,程序应该链接到库的分析版本(如果没有分析版本,则链接到标准归档版本)而不是共享目标文件,以获取关于库函数的配置文件信息。分析库版本可能由系统在 /usr/lib/libp 目录中提供。请参阅编译器驱动程序文档获取分析信息。
需要考虑极端情况。与共享 C 库动态链接的分析程序在某些 libc 例程中会花费 100 个时间单位,如 malloc()。假设 malloc() 仅从例程 B 中被调用,且 B 仅消耗 1 个时间单位。进一步假设例程 A 消耗 10 个时间单位,超过映像主要(分析)部分中的任何其他例程。在此情况下,prof 将推断,大部分时间花费在 A 中,几乎没有在 B 中花费时间。基于此,几乎不可能得出,可通过查看例程 B 而不是例程 A 来获取最大提升。以上情况中分析器的值严重退化;解决方案是尽可能多地使用归档进行分析。