美文网首页
gprof 工具

gprof 工具

作者: wayyyy | 来源:发表于2021-04-30 10:51 被阅读0次

    gprof是GNU profiler工具。可以显示程序运行的“flat profile”,包括每个函数的调用次数,每个函数消耗的处理器时间。也可以显示“调用图”,包括函数的调用关系,每个函数调用花费了多少时间。还可以显示“注释的源代码”,是程序源代码的一个复本,标记有程序中每行代码的执行次数。

    基本用法
    1. 使用 -pg 选项编译和链接你的应用程序。
    2. 执行你的应用程序,使之运行完成后生成供 gprof 分析的数据文件(默认是gmon.out)。
    3. 使用 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

    相关文章

      网友评论

          本文标题:gprof 工具

          本文链接:https://www.haomeiwen.com/subject/cquvrltx.html