gprof是GNU profiler工具。可以显示程序运行的“flat profile”,包括每个函数的调用次数,每个函数消耗的处理器时间。也可以显示“调用图”,包括函数的调用关系,每个函数调用花费了多少时间。还可以显示“注释的源代码”,是程序源代码的一个复本,标记有程序中每行代码的执行次数。
基本用法
- 使用
-pg
选项编译和链接你的应用程序。 - 执行你的应用程序,使之运行完成后生成供 gprof 分析的数据文件(默认是gmon.out)。
- 使用 gprof 程序分析你的应用程序生成的数据,例如:gporf a.out gmon.out。
案例
gprof 产生的信息:
-
% time
the percentage of the total running time of the program used by this function.
函数使用时间占所有时间的百分比。 -
cumulative seconds
a running sum of the number of seconds accounted for by this function and those listed above it.
函数和上列函数累计执行的时间。 -
self seconds
the number of seconds accounted for by this function alone. This is the major sort for this listing.
函数本身所执行的时间。 -
calls
the number of times this function was invoked, if this function is profiled, else blank.
函数被调用的次数 -
self ms/call
the average number of milliseconds spent in this function per call, if this function is profiled, else blank.
每一次调用花费在函数的时间microseconds。 -
total ms/call
the average number of milliseconds spent in this function and its descendents per call, if this function is profiled, else blank.
每一次调用,花费在函数及其衍生函数的平均时间microseconds。
常用的gprof命令选项
- -b
不再输出统计图表中每个字段的详细描述。 - -p
只输出函数的调用图(Call graph的那部分信息)。 - -q
只输出函数的时间消耗列表。 - -e Name
不再输出函数Name 及其子函数的调用图(除非它们有未被限制的其它父函数)。可以给定多个 -e 标志。一个 - -e
标志只能指定一个函数。 - -E Name
不再输出函数Name 及其子函数的调用图,此标志类似于 -e 标志,但它在总时间和百分比时间的计算中排除了由函数Name 及其子函数所用的时间。 - -f Name
输出函数Name 及其子函数的调用图。可以指定多个 -f 标志。一个 -f 标志只能指定一个函数。 - -F Name
输出函数Name 及其子函数的调用图,它类似于 -f 标志,但它在总时间和百分比时间计算中仅使用所打印的例程的时间。可以指定多个 -F 标志。一个 -F 标志只能指定一个函数。-F 标志覆盖 -E 标志。 - -z
显示使用次数为零的例程(按照调用计数和累积时间计算)。
使用注意
-
一般gprof只能查看用户函数信息。如果想查看库函数的信息,需要在编译是再加入“-lc_p”编译参数代替“-lc”编译参数,这样程序会链接libc_p.a库,才可以产生库函数的profiling信息。
-
gprof只能在程序正常结束退出之后才能生成程序测评报告,原因是gprof通过在atexit()里注册了一个函数来产生结果信息,任何非正常退出都不会执行atexit()的动作,所以不会产生gmon.out文件。如果你的程序是一个不会退出的服务程序,那就只有修改代码来达到目的。如果不想改变程序的运行方式,可以添加一个信号处理函数解决问题(这样对代码修改最少)
gprof 实现原理
TODO
网友评论