您的位置:首页 > 其它

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

2016-01-15 14:15 316 查看
利用 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: