当前位置: 首页 > news >正文

调试工具-gprof

2019独角兽企业重金招聘Python工程师标准>>> 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

相关文章:

  • 分页插件jquery.pagination.js
  • C#中ref和out的使用小结
  • Cocoa.Programming.for.Mac.OS.X 3rd 前8章小知识点
  • 用apache搭建web服务器
  • android: scrollbarStyle
  • LINQ 关键字
  • Linux 一次性杀死用户所有进程
  • 解决websphere6.1必须为元素类型web-app声明属性version
  • 将32位无符号整数表示的时间信号转化为习惯的形式
  • 财经法规与会计职业道德1
  • 截取字符串显示
  • Android TextView内容过长加省略号,点击显示全部内容
  • 一直令我纠结的问题,关于“线程”与“阻塞”
  • 随记:Linux下apache2.4.4的安装
  • 2012年最具影响力路由器配置精品文章荟萃【108篇】
  • Android 架构优化~MVP 架构改造
  • Android交互
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • Docker下部署自己的LNMP工作环境
  • HTTP中的ETag在移动客户端的应用
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • Js基础——数据类型之Null和Undefined
  • PAT A1120
  • Python - 闭包Closure
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • 二维平面内的碰撞检测【一】
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 如何在GitHub上创建个人博客
  • 入口文件开始,分析Vue源码实现
  • 追踪解析 FutureTask 源码
  • NLPIR智能语义技术让大数据挖掘更简单
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • # 飞书APP集成平台-数字化落地
  • #14vue3生成表单并跳转到外部地址的方式
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • #QT(串口助手-界面)
  • (+4)2.2UML建模图
  • (办公)springboot配置aop处理请求.
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (四)JPA - JQPL 实现增删改查
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (一)Neo4j下载安装以及初次使用
  • (原創) 物件導向與老子思想 (OO)
  • (转)详解PHP处理密码的几种方式
  • .libPaths()设置包加载目录
  • .Net core 6.0 升8.0
  • .net framework4与其client profile版本的区别
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • .NET中的Exception处理(C#)
  • .skip() 和 .only() 的使用
  • @Autowired多个相同类型bean装配问题
  • [1204 寻找子串位置] 解题报告
  • [2023-年度总结]凡是过往,皆为序章