博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
调试工具-gprof
阅读量:6188 次
发布时间:2019-06-21

本文共 1488 字,大约阅读时间需要 4 分钟。

hot3.png

gprof是linux系统自带的
GNU profile
工具
提供
  1. 1.程序运行的“flat profile”,包括每个函数的调用次数,每个函数消耗的处理器时间。
  2. 2.“调用图”,包括函数的调用关系,每个函数调用花费了多少时间。
  3. 3.“注释的源代码”,是程序源代码的一个复本,标记有程序中每行代码的执行次数。
用法
  1. 1.使用-pg选项编译和链接你的应用程序。
  2. 2.执行你的应用程序,使之运行完成后生成供gprof分析的数据文件(默认是gmon.out)。
  3. 3.使用gprof程序分析你的应用程序生成的数据,例如:gporf a.out gmon.out。
示例
  1. gcc -Wall -pg -o test test.c  //程序文件名称 test.c 编译时使用 -pg
  2. ./test //现在可以再次运行test,并使用前面使用的测试数据
  3. //这次运行时,test运行的分析数据会被搜集并保存在'gmon.out'文件中
  4. gprof test //可以通过运行 ' gprof test '来查看结果。
原理
  1. gprof,在编译和链接程序的时 候(使用 -pg 编译和链接选项),gcc 在你应用程序的每个函数中都加入了一个名为mcount(or“_mcount”, or“__mcount”)的函数,
  2. 也就是说-pg编译的应用程序里的每一个函数都会调用mcount, 而mcount会在内存中保存一张函数调用图,并通过函数调用堆栈的形式查找子函数和父函数的地址。这张调用图也保存了所有与函数相关的调用时间,调用次数等等的所有信息。
  3. 程序运行结束后,会在程序退出的路径下生成一个 gmon.out文件。这个文件就是记录并保存下来的监控数据。可以通过命令行方式的gprof或图形化的Kprof来解读这些数据并对程序的性能进行分析。
  4. 另外,如果想查看库函数的profiling,需要在编译是再加入“-lc_p”编译参数代替“-lc”编译参数,这样程序会链接libc_p.a 库,才可以产生库函数的profiling信息。如果想执行一行一行的profiling,还需要加入“-g”编译参数。
缺点
  1. 1.调试多线程程序只能统计主线程的信息
  2. 2.不能用于调试后台进程
  3. 3.只有正常退出时才能产生gmon.out文件
对缺点3.的说明
  1. 原因是gprof通过在atexit()里注册了一个函数来产生结果信息,任何非正常退出都不会执行atexit()的动作,所以不会产生gmon.out文件。
  2. 如果你的程序是一个不会退出的服务程序,那就只有修改代码来达到目的。如果不想改变程序的运行方式,可以添加一个信号处理函数解决问题(这样对代码修改最少),例如:
  3. static void sighandler( int sig_no )
  4. {
  5. exit(0);
  6. }
  7. signal( SIGUSR1, sighandler );
  8. 当使用kill -USR1 pid 后,程序退出,生成gmon.out文件。
输出项说明
  1. %  函数使用时间占所有时间的百分比
  2. cumulative  函数和上列函数累计执行的时间(seconds)
  3. self 函数本身所执行的时间(seconds)
  4. calls  函数被调用的次数
  5. self ms/call  每一次调用花费在函数的时间microseconds。
  6. total ms/call  每一次调用,花费在函数及其衍生函数的平均时间microseconds。
  7. name  函数名

转载于:https://my.oschina.net/liangzi1210/blog/113284

你可能感兴趣的文章
拿空间换时间的字典-Python基础前传(9)
查看>>
【镜像更新】Windows Server 2016 数据中心版
查看>>
文远知行公布自动驾驶运营路线图:全新升级自动驾驶方案,建立500辆规模的自动驾驶车队...
查看>>
OSS-Android SDK 搭建总结
查看>>
App Store 4.3 大礼包被拒解决方案-本地差异化
查看>>
作为币圈新韭菜的你,还不知道什么是山寨币和空气币?
查看>>
想要成为黑客?那你需要学会这些知识
查看>>
CoreOS镜像更新
查看>>
[译]PEP 342--增强型生成器:协程
查看>>
我在蚂蚁金服做SRE
查看>>
Java-final最终修饰符
查看>>
Node.js之Stream可读流readable
查看>>
【对讲机的那点事】公网对讲关键指标之组呼建立时延
查看>>
SignalR主动通知订阅者示例
查看>>
CUBA Platform 7.0.3 发布,企业级应用开发平台
查看>>
MRoot 2.2 发布,全新 UI 界面,更好的集群
查看>>
vim python一键执行、高亮等一键安装
查看>>
《致云雀》(英)雪莱
查看>>
nginx 安装
查看>>
运用hanlp 通过 python 结合jpype 导出依存句法可视化
查看>>