C调试方法之--------Gprofile
来源:互联网 发布:施耐庵子孙 哑巴 知乎 编辑:程序博客网 时间:2024/06/15 08:10
一、GProfile简介
GProfile是gcc的一个工具,用于对应用程序的测试。
GProfile可以分析出函数的调用次数、函数的调用关系以及函数消耗的时间。
二、GProfile原理
在编译和链接你的程序的时候,gcc 在你应用程序的每个函数中都加入了一个名为mcount ( or "_mcount" , or "__mcount" , 依赖于编译器或操作系统)的函数,也就是说你的应用程序里的每一个函数都会调用mcount, 而mcount 会在内存中保存一张函数调用图,并通过函数调用堆栈的形式查找子函数和父函数的地址。这张调用图也保存了所有与函数相关的调用时间,调用次数等等的所有信息。
程序运行结束后,会在程序退出的路径下生成一个gmon.out文件,用来保存监控数据。从而通过gprof来解读数据对程序进行分析。
三、GProfile用法
1、在编译时加入参数 -pg就可以打开GProfile的开关。
2、gprof只查看用户函数信息,不能对库函数进行查看。 如果想查看库函数的信息,在编译时加入"-lc_p"编译参数代替"-lc"编译参数,这样程序会链接libc_p.a库,就可以查看库函数的信息了。
3、 gprof只能在程序正常结束退出之后才能生成程序测评报告,原因是gprof通过在atexit()里注册了一个函数来产生结果信息,任何非正常退出都不会执行atexit()的动作,所以不会产生gmon.out文件。如果你的程序是一个不会退出的服务程序,那就只有修改代码来达到目的。如果不想改变程序的运行方式,可以添加一个信号处理函数解决问题(这样对代码修改最少),例如:
static void sighandler( int sig_no )
{
exit(0);
}
signal( SIGUSR1, sighandler );
当使用kill -USR1 pid 后,程序退出,生成gmon.out文件。
四、GProfile举例
五、GProfile对于结果的分析
-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 显示使用次数为零的例程(按照调用计数和累积时间计算)。
GProfile的详细请参考:http://www.cs.utah.edu/dept/old/texinfo/as/gprof.html
这个文档对GProfile说的很详细,很好。
- C调试方法之--------Gprofile
- C调试方法之--------Gprofile
- Gprofile
- gprofile tips
- 【C++】vs2010调试方法
- GProfile的总结
- GProfile的总结
- [C++] gdb高级调试方法
- c/c++ 程序调试方法
- C/C++ 之 gdb 调试
- c语言 调试程序必备 c标准 宏 调试方法
- VC Release 之调试方法
- Xcode 调试之方法大全
- 驱动程序调试方法之printk
- 【C语言】 C语言之调试
- 几种实用调试方法-C语言
- [C#] 利用部分方法添加调试代码
- c语言编码 调试信息打印方法
- AES加密,解密封装。以及解密异常解决
- Python中的正则表达式教程
- EF外键表/视图必须有外键否则被设置为可读的解决方案
- Spring自动扫描和管理bean
- KSVD算法原理简述
- C调试方法之--------Gprofile
- Java生成二维码
- Express cookie-parser
- tomcat的service.bat注册成服务不能调用系统证书,而手动启动start.bat却可以
- 【产品】QOC:如何让设计思考被看见?
- absolute问题
- Optical Flow学习心得
- Deep Learning学习 - VGG-Face网络人脸识别
- C++中引用的使用总结