GPROF 统计函数执行时间
2016-10-08 16:52
267 查看
gprof的基本用法:
1. 使用 -pg 选项编译和链接你的应用程序 ,在gcc编译程序的时候,加上-pg选项,如果是大项目,就在makefile里面修改编译选项,-pg放在那里都行。例如:
gcc -pg -o test test.c
2. 执行你的应用程序使之生成供gprof 分析的数据,运行刚才的程序:
./test,
这样就生成了一个gmon.out文件,该文件就包含了profiling的数据。
3. gprof ./test gmon.out
通过在编译和链接你的程序的时候(使用 -pg 编译和链接选项),gcc 在你应用程序的每个函数中都加入了一个名为mcount ( or "_mcount" , or "__mcount" , 依赖于编译器或操作系统)的函数,也就是说你的应用程序里的每一个函数都会调用mcount, 而mcount 会在内存中保存一张函数调用图,并通过函数调用堆栈的形式查找子函数和父函数的地址。这张调用图也保存了所有与函数相关的调用时间,调用次数等等的所有信息。
一,gprof只能查看用户函数信息。如果想查看库函数的信息,需要在编译是再加入"-lc_p"编译参数代替"-lc"编译参数,这样程序会链接libc_p.a库,如果系统没有libc_p.a库,需要自己编译这个库。
二,gprof不能产生gmom.out文件的原因:gprof只能在程序正常结束退出之后才能生成程序测评报告,原因是gprof通过在atexit()里注册了一个函数来产生结果信息,任何非正常退出都不会执行atexit()的动作,所以不会产生gmon.out文件。所以,以下情况可能不会有gmon.out文件产生:
1,程序不是从main return或exit()退出,则可能不生成gmon.out。
2,程序如果崩溃,可能不生成gmon.out。
3,测试发现在虚拟机上运行,可能不生成gmon.out。
4,程序忽略SIGPROF信号!一定不能捕获、忽略SIGPROF信号。man手册对SIGPROF的解释是:profiling timer expired. 如果忽略这个信号,gprof的输出则是:Each sample counts as 0.01 seconds. no time accumulated.
5,如果程序运行时间非常短,则gprof可能无效。因为受到启动、初始化、退出等函数运行时间的影响。如果你的程序是一个不会退出的服务程序,那就只有修改代码来达到目的。如果不想改变程序的运行方式,可以添加一个信号处理函数解决问题(这样对代码修改最少),例如:
static void sighandler( int sig_no )
{
exit(0);
}
signal( SIGUSR1, sighandler );
这样当使用kill -USR1 pid 后,程序退出,生成gmon.out文件。
三,多线程使用:
gprof无法分析多线程程序。缘故是gprof使用ITIMER_PROF定时器, 当超时时由内核向应用程序发送信号。但多线程程序只有主线程接收ITIMER_PROF。 这里有一个简单的实现方法: 对pthread_create进行保证,并以动态库的形式在程序运行前加载。
<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
阅读(825) | 评论(0) | 转发(0) |
0
上一篇:bitmap之stride
下一篇:编译GLIBC
相关热门文章
socket中的短连接与长连接,心...
Haproxy、Keepalived双主高可...
Tomcat的性能与最大并发(1000)...
Nginx深入详解之日志
socket编程的同步、异步与阻塞...
linux dhcp peizhi roc
关于Unix文件的软链接
求教这个命令什么意思,我是新...
sed -e "/grep/d" 是什么意思...
谁能够帮我解决LINUX 2.6 10...
给主人留下些什么吧!~~
评论热议
1. 使用 -pg 选项编译和链接你的应用程序 ,在gcc编译程序的时候,加上-pg选项,如果是大项目,就在makefile里面修改编译选项,-pg放在那里都行。例如:
gcc -pg -o test test.c
2. 执行你的应用程序使之生成供gprof 分析的数据,运行刚才的程序:
./test,
这样就生成了一个gmon.out文件,该文件就包含了profiling的数据。
3. gprof ./test gmon.out
原理
通过在编译和链接你的程序的时候(使用 -pg 编译和链接选项),gcc 在你应用程序的每个函数中都加入了一个名为mcount ( or "_mcount" , or "__mcount" , 依赖于编译器或操作系统)的函数,也就是说你的应用程序里的每一个函数都会调用mcount, 而mcount 会在内存中保存一张函数调用图,并通过函数调用堆栈的形式查找子函数和父函数的地址。这张调用图也保存了所有与函数相关的调用时间,调用次数等等的所有信息。
存在的问题
一,gprof只能查看用户函数信息。如果想查看库函数的信息,需要在编译是再加入"-lc_p"编译参数代替"-lc"编译参数,这样程序会链接libc_p.a库,如果系统没有libc_p.a库,需要自己编译这个库。二,gprof不能产生gmom.out文件的原因:gprof只能在程序正常结束退出之后才能生成程序测评报告,原因是gprof通过在atexit()里注册了一个函数来产生结果信息,任何非正常退出都不会执行atexit()的动作,所以不会产生gmon.out文件。所以,以下情况可能不会有gmon.out文件产生:
1,程序不是从main return或exit()退出,则可能不生成gmon.out。
2,程序如果崩溃,可能不生成gmon.out。
3,测试发现在虚拟机上运行,可能不生成gmon.out。
4,程序忽略SIGPROF信号!一定不能捕获、忽略SIGPROF信号。man手册对SIGPROF的解释是:profiling timer expired. 如果忽略这个信号,gprof的输出则是:Each sample counts as 0.01 seconds. no time accumulated.
5,如果程序运行时间非常短,则gprof可能无效。因为受到启动、初始化、退出等函数运行时间的影响。如果你的程序是一个不会退出的服务程序,那就只有修改代码来达到目的。如果不想改变程序的运行方式,可以添加一个信号处理函数解决问题(这样对代码修改最少),例如:
static void sighandler( int sig_no )
{
exit(0);
}
signal( SIGUSR1, sighandler );
这样当使用kill -USR1 pid 后,程序退出,生成gmon.out文件。
三,多线程使用:
gprof无法分析多线程程序。缘故是gprof使用ITIMER_PROF定时器, 当超时时由内核向应用程序发送信号。但多线程程序只有主线程接收ITIMER_PROF。 这里有一个简单的实现方法: 对pthread_create进行保证,并以动态库的形式在程序运行前加载。
<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
阅读(825) | 评论(0) | 转发(0) |
0
上一篇:bitmap之stride
下一篇:编译GLIBC
相关热门文章
socket中的短连接与长连接,心...
Haproxy、Keepalived双主高可...
Tomcat的性能与最大并发(1000)...
Nginx深入详解之日志
socket编程的同步、异步与阻塞...
linux dhcp peizhi roc
关于Unix文件的软链接
求教这个命令什么意思,我是新...
sed -e "/grep/d" 是什么意思...
谁能够帮我解决LINUX 2.6 10...
给主人留下些什么吧!~~
评论热议
相关文章推荐
- golang 之 defer(统计函数执行时间)
- Linux下的函数执行时间的统计方法
- c++ 统计函数执行时间class
- Linux下的函数执行时间的统计方法
- Linux下的函数执行时间的统计方法
- golang 之 defer(统计函数执行时间)
- c语言中如何添加计时函数,统计程序执行的时间
- Linux下的函数执行时间的统计方法
- c语言中如何添加计时函数,统计程序执行的时间
- c语言中如何添加计时函数,统计程序执行的时间
- 在JS中统计函数执行次数与执行时间
- Linux下的函数执行时间的统计方法
- 用于统计函数执行时间的类
- Linux下的函数执行时间的统计方法
- 详解JS中统计函数执行次数与执行时间
- c语言中如何添加计时函数,统计程序执行的时间
- c语言中如何添加计时函数,统计程序执行的时间
- c语言中如何添加计时函数,统计程序执行的时间
- c语言中如何添加计时函数,统计程序执行的时间
- linux 函数执行时间统计