程序分析工具不同于调试器,它只产生程序运行时某些函数的调用次数、执行时间等等宏观信息,而不是每条语句执行时的详细信息。Gprof是Linux下一个强有力的程序分析工具。对于C、Pascal或者Fortran77语言的程序,它能够以“日志”的形式记录程序运行时的统计信息:程序运行中各个函数消耗的时间和函数调用关系,以及每个函数被调用的次数等等。从而可以帮助程序员找出众多函数中耗时最多的函数,也可以帮助程序员分析程序的运行流程。相信这些功能对于分析开源代码的程序员来说,有着相当大的诱惑力。
用gprof分析程序
用gprof对程序进行分析主要分以下三个步骤:
l 用编译器对程序进行编译,加上-pg参数。
l 运行编译后的程序。
l 用gprof命令查看程序的运行时信息。
-g
产生带有调试信息的目标代码
Ignored. Provided for compatibility with other tools.
gcc 的 -g ,应该没有人不知道它是一个调试选项,因此在一般需要进行程序调试的场景下,我们都会加上该选项,并且根据调试工具的不同,还能直接选择更有针对性的说明,比如 -ggdb 。-g是一个编译选项,即在源代码编译的过程中起作用,让gcc把更多调试信息(也就包括符号信息)收集起来并将存放到最终的可执行文件内。
相比-g选项, -rdynamic 却是一个 连接选项 ,它将指示连接器把所有符号(而不仅仅只是程序已使用到的外部符号)都添加到动态符号表(即.dynsym表)里,以便那些通过 dlopen() 或 backtrace() (这一系列函数使用.dynsym表内符号)这样的函数使用。
gprof可以对C\C++等应用程序进行剖析,可以打印出程序运行中各个函数消耗时间,方便优化代码以及分析程序的运行流程。
为直观查看gprof结果,可以使用gprof2dot工具生成图
gprof2dot官方文档: https://github.com/jrfonseca/gprof2dot
使用流程
一、编译时加上-pg
例如有一个例子example.c程序
gcc example.c -pg -o example
二、运行程序
./example arg1 arg2...
运行完程序之后,会在当前目录生成一个文件gmou.out,这个文件会展示一些信息,但是分析结果不够直观,特别是函数的调用,因此可以进行步骤三
三、利用可视化工具展示结果
1. 安装
gprof2dot工具需要
python: 2.7或3.3版本
Graphviz
在Linux系统安装
pip install gprof2dot
2. 使用
gprof ./example gmon.out|less -S 可以直接查看文字
gprof ./example gmon.out |gprof2dot |dot -Tpng -o example.png 可视化展示
会生成类似图: