程序分析工具不同于调试器,它只产生程序运行时某些函数的调用次数、执行时间等等宏观信息,而不是每条语句执行时的详细信息。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  可视化展示 

会生成类似图:

Linux c++ 性能分析工具gprof_2d