gprof之线程分析
来源:互联网 发布:php视频教程 百度网盘 编辑:程序博客网 时间:2024/05/21 06:32
- gprof用于分析函数调用耗时,可用之抓出最耗时的函数,以便优化程序。
- gcc链接时也一定要加-pg参数,以使程序运行结束后生成gmon.out文件,供gprof分析。
- gprof默认不支持多线程程序,默认不支持共享库程序。
- gcc -pg 编译程序
- 运行程序,程序退出时生成 gmon.out
- gprof ./prog gmon.out -b 查看输出
- 程序如果不是从main return或exit()退出,则可能不生成gmon.out。
- 程序如果崩溃,可能不生成gmon.out。
- 测试发现在虚拟机上运行,可能不生成gmon.out。
- 一定不能捕获、忽略SIGPROF信号。man手册对SIGPROF的解释是:profiling timer expired. 如果忽略这个信号,gprof的输出则是:Each sample counts as 0.01 seconds. no time accumulated.
- 如果程序运行时间非常短,则gprof可能无效。因为受到启动、初始化、退出等函数运行时间的影响。
- 程序忽略SIGPROF信号!
gcc -pg 在应用程序的每个函数中添加了名为 mcount/mcount/_mcount的函数。 应用程序每个函数执行时都会执行mcount,而mcount则会在内存中保存一张函数调用图, 通过函数调用堆栈的形式,查找子函数、父函数的地址,也保存了与函数相关的调用时间、次数等信息。
多进程
如果用gprof分析多进程程序,则可能一个进程的gmon.out覆盖另一个进程的gmon.out, 解决方法是在执行程序之前执行:export GMON_OUT_PREFIX=x.out 则之后生成的文件名就如x.out.pid,多进程的gmon.out就不会相互覆盖。
多线程
gprof无法分析多线程程序。缘故是gprof使用ITIMER_PROF定时器, 当超时时由内核向应用程序发送信号。但多线程程序只有主线程接收ITIMER_PROF。
解决无法生成gmon.out方法:
static void sighandler(int sig_no){
if(sig_no==SIGUSR1){
log_msg_ex("received singal:%d ,exit", sig_no);
exit(0);
}
}
int main(int argc, char** argv) {
signal(SIGUSR1,sighandler);
}
终端执行命令:root@qyt-desktop:/home/qyt# kill -USR1 28912
0 0
- gprof之线程分析
- linux性能分析工具之gprof
- 程序分析gprof
- 程序分析工具gprof
- Gprof应用程序性能分析
- 时间消耗分析-gprof
- 程序分析工具gprof
- Gprof性能分析工具
- 性能分析工具--- gprof
- 程序分析工具gprof
- 程序分析工具gprof介绍
- binutils-2.18/gprof/Makefile分析
- linux性能分析工具gprof
- 程序分析工具gprof介绍
- 使用gprof分析程序(转贴)
- 性能分析工具gprof介绍
- 程序分析工具gprof介绍
- 用gprof分析性能初步
- PowerDesigner使用ODBC连接Mysql数据库
- 前端代码学习笔记 javascript
- C/C++段错误问题排查和解决方法
- (补)阅读程序
- Pro Android学习笔记(一一四):2D动画(9):Property Animation(下)
- gprof之线程分析
- java string直接读写mysql datetime类型
- 元祖
- 路由器ping不通怎么办故障排除及Ping命令使用注意
- c++引用
- win10无法完全关机的解决方法
- Collaborative Filtering协同过滤推荐算法
- MySql 快速插入千万级大数据
- css框模型