您的位置:首页 > 运维架构 > Linux

linux下的profile工具GNU gprof和Valgrind

2014-12-05 14:56 651 查看
最近尝试了两个profile工具,gprof和valgrind,总体来说还是更喜欢Valgrind,不用重新编译程序就能看到结果,配合可视化程序也可以让统计显示的非常清晰。

1. gprof

gprof(GNU profiler)是GNU binutils工具集中的一个工具,linux系统当中会自带这个工具。它可以分析程序的性能,能给出函数调用时间、调用次数和调用关系,找出程序的瓶颈所在。在编译和链接选项中都加入-pg之后,gcc会在每个函数中插入代码片段,用于记录函数间的调用关系和调用次数,并采集函数的调用时间。

使用方法:

(1) 在编译和链接时,加上-pg编译选项;

(2) 执行编译成功的程序,此时会在可执行程序所在目录生成gmon.out文件;

(3) 使用gprof命令分析gmon.out文件得到报告(包含flat profile和call graph)。

gprof options [executalbe-file[profile-date-files...]] [>outfile]

如果executalbe-file缺省,将使用a.out执行文件;如果profile-date-files缺省,将使用gmon.out;如果profile-date-files文件有多个文件,报告计数时会把数据文件叠加在一起。

一些参数的说明如下:

-e function_name

在callgraph中不显示这个函数和她的子函数们的信息,可以指定多个-e,一个函数只能指定一个-e

-E function_name

在-e的基础上,在call graph计算函数时间占比时,也不会使用她和其他未被调用的子函数的信息,可以使用多个-E,一个函数只能指定一个-E

-f function name

在callgraph中只显示这个函数和她的子函数们的信息,可以指定多个-f,一个函数只能指定一个-f

-F function name

在-f的基础上,在call graph计算函数时间占比时,只使用她和她的子函数们的信息。可以指定多个-F,一个函数只能指定一个-F,-F会覆盖-E

-z

在flatprofile中显示所有函数,即便没有被调用过,或者运行时间为0

-c

在callgraph中显示所有函数,即便没有被调用过

2. Valgrind

Valgrind是用于内存泄露和threading bugs检测以及程序性能分析的一款开源工具。作者曾经获得Google开源Best Tool Maker奖项。Valgrind含有很多工具:

(1) Memcheck

用来检测程序中出现的内存问题,所有对内存的读写都会被检测到,一切对malloc/new/free/delete的调用都会被捕获,来检测问题。

(2) Cachegrind

Cache分析工具,它模拟CPU中的一级缓存I1,Dl和二级缓存,能够精确地指出程序中cache的丢失和命中。如果需要,它还能够为我们提供cache丢失次数,内存引用次数,以及每行代码,每个函数,每个模块,整个程序产生的指令数。

(3) Callgrind

是Cachegrind的扩充版,它在提供Cachegrind工具所有信息的基础上,还提供函数调用图。Callgrind是和gprof类似的分析工具,但它对程序的运行观察更是入微,能给我们提供更多的信息。和gprof不同,它不需要在编译源代码时附加特殊选项,但加上调试选项是推荐的。Callgrind收集程序运行时的一些数据,建立函数调用关系图,还可信以有选择地进行cache模拟。在运行结束时,它会把分析数据写入一个文件。也是我们在profile时主要使用的工具

(4) Massif

Massif是一个堆栈分析工具。它能测量程序在堆栈中使用了多少内存,告诉我们堆块,堆管理块和栈的大小。Massif能帮助我们减少内存的使用,在带有虚拟内存的现代系统中,它还能够加速我们程序的运行。

(5) Helgrind

Helgrind主要用来检查多线程程序中出现的竞争问题。Helgrind寻找内存中被多个线程访问,而又没有一贯加锁的区域,这些区域往往是线程之间失去同步的地方,而且会导致难以发掘的错误。Helgrind仍然处于实验阶段。

使用方法:

(1) 安装valgrind和kcachegrind

(2) 运行valgrind --tool=callgrind <executalbe-file>

(3) kcachegrind callgrind.out.x,x为生成的数据文件后几位,也就是进程的PID编号

在使用valgrind对整个程序进行profile的时候,其实我们统计的是指令数而不是时间。也就是说我们暗含了假设cpu做每个指令的时间都相等,但实际上并不一定是这样的。kcachegrind是个很赞的工具,可以把结果可视化的显示出来。其实valgrind的主要功能是来检查内存泄露的,但是用来做profile效果也不错。
如果只想关注程序中的某一个函数可以:

valgrind --toll=callgrind --toggle-collect=<function name> <executalbe-file>

注意function name是个字符串,两边要加上双引号才好。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: