使用gprof 或 valgrind查看函数调用频率及程序性能瓶颈调试

利用 gprof2dot 和graphviz 图形化定位linux c/c++系统性能瓶颈
1 下载
http://code.google.com/p/jrfonseca/wiki/Gprof2Dot    下载gprof2dot.py
http://www.graphviz.org/Download_source.php        下载graphviz-2.18.tar.gz
 
2 安装
chmod +x gprof2dot.py
tar -xf graphviz-2.18.tar.gz
cd graphviz-2.38.0
./configure
make
make install
 
3 编译代码
gcc -pg -g -o test test.c
 
4 执行代码生成gmon.out
./test
file gmon.out
如果gprof ./test:
gmon.out file is missing call-graph data
则表示没有正确的编译选项或者只有一个main函数
 
5 生成图片
gprof ./test  | ./gprof2dot.py -n0 -e0 | dot -Tsvg -o output.svg
 
gprof2dot默认是部分函数调用图,对性能影响不大的函数调用都不显示,例如上图中没有出现类的构造,析构函数,
如果想要显示全部的函数调用,可以 gprof2dot -n0 -e0 ,默认是n0.5即影响小于5%的函数就不显示了。
当然这样图片会很乱,因为显示内容很多,可以 gprof2dot -n0 -e0 -s
-s表示不显示诸如模板,函数入口参数等等,使得函数名称显示更加精简


gprof这个常用的性能工具,用来性能调优很方便。
但是有个致命的缺点,不能处理动态链接库(dlopen()加载的)。
这时候可以用callgrind
callgrind是valgrind工具集中的一个,使用方便。gcc带上-g参数,然后用callgrind运行
callgrind运行的程序会非常的慢。
运行完之后文件夹下出现了callgrind.out.***便是日志文件,需要用工具查看,
可以在终端用callgrind_annotate查看,也可以用图形前端kcachegrind查看
编译运行:
    gcc -o test -g test.c

    valgrind --tool=callgrind ./test


/* test.c */

#include <stdio.h>
#include <stdlib.h>
 
void f1()
{
	int i;
	int *p;
	for (i = 0; i < 10; i++) {
		p = malloc(sizeof(int));
		*p = 10;
		free(p);
	}
}
 
void f2()
{
	int i;
	int *p;
	for (i = 0; i < 20; i++) {
		p = malloc(sizeof(int));
		*p = 10;
		free(p);
	}
}
 
void f3()
{
	int i;
	int *p;
	for (i = 0; i < 30; i++) {
		p = malloc(sizeof(int));
		*p = 10;
		free(p);
	}
}
 
int main()
{
	int i;
 
	for (i = 0; i < 1000000; i++) {
		f1();
		f2();
		f3();
	}
 
	return 0;
}


你可能感兴趣的:(使用gprof 或 valgrind查看函数调用频率及程序性能瓶颈调试)