﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-C++ Coder-随笔分类-性能分析工具</title><link>http://www.cppblog.com/jackdongy/category/20108.html</link><description>HCP高性能计算架构，实现，编译器指令优化，算法优化，
  LLVM   CLANG   OpenCL   CUDA   OpenACC    C++AMP   OpenMP   MPI</description><language>zh-cn</language><lastBuildDate>Sun, 28 Oct 2012 13:41:37 GMT</lastBuildDate><pubDate>Sun, 28 Oct 2012 13:41:37 GMT</pubDate><ttl>60</ttl><item><title>GProfile的总结</title><link>http://www.cppblog.com/jackdongy/archive/2012/10/26/193906.html</link><dc:creator>jackdong</dc:creator><author>jackdong</author><pubDate>Fri, 26 Oct 2012 07:41:00 GMT</pubDate><guid>http://www.cppblog.com/jackdongy/archive/2012/10/26/193906.html</guid><wfw:comment>http://www.cppblog.com/jackdongy/comments/193906.html</wfw:comment><comments>http://www.cppblog.com/jackdongy/archive/2012/10/26/193906.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jackdongy/comments/commentRss/193906.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jackdongy/services/trackbacks/193906.html</trackback:ping><description><![CDATA[<a href="http://blog.csdn.net/dongjun7357/article/details/6277682">http://blog.csdn.net/dongjun7357/article/details/6277682</a><br /><br />
<p>一、GProfile简介</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GProfile是gcc的一个工具，用于对应用程序的测试。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GProfile可以分析出函数的调用次数、函数的调用关系以及函数消耗的时间。</p>
<p>&nbsp;</p>
<p>二、GProfile原理</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(75,78,81)">在编译和链接你的程序的时候，gcc 在你应用程序的每个函数中都加入了一个名为mcount ( or "_mcount" , or "__mcount" , 依赖于编译器或操作系统)的函数，也就是说你的应用程序里的每一个函数都会调用mcount, 而mcount 会在内存中保存一张函数调用图，并通过函数调用堆栈的形式查找子函数和父函数的地址。这张调用图也保存了所有与函数相关的调用时间，调用次数等等的所有信息。&nbsp;</span></p>
<p>&nbsp;&nbsp;&nbsp; <span style="font-size: small"><span style="font-family: 宋体; mso-ascii-font-family: Verdana; mso-fareast-font-family: 宋体; mso-hansi-font-family: Arial">&nbsp;程序运行结束后，会在程序退出的路径下生成一个</span><span style="font-family: Verdana; mso-ascii-font-family: Verdana; mso-fareast-font-family: 宋体; mso-hansi-font-family: Arial">gmon.out</span><span style="font-family: 宋体; mso-ascii-font-family: Verdana; mso-fareast-font-family: 宋体; mso-hansi-font-family: Arial">文件，用来保存监控数据。从而</span><span style="font-family: 宋体; mso-ascii-font-family: Verdana; mso-fareast-font-family: 宋体; mso-hansi-font-family: Arial">通过</span><span lang="EN-US" style="font-family: Verdana; mso-ascii-font-family: Verdana; mso-fareast-font-family: 宋体; mso-hansi-font-family: Arial; mso-fareast-language: ZH-CN">gprof</span><span style="font-family: 宋体; mso-ascii-font-family: Verdana; mso-fareast-font-family: 宋体; mso-hansi-font-family: Arial">来解读数据对程序进行分析。</span></span></p>
<p><span style="color: rgb(75,78,81)">&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0)"> </span></span></p>
<p><span style="color: rgb(75,78,81)">三、GProfile用法</span></p>
<p><span style="color: rgb(75,78,81)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、在编译时加入参数 -pg就可以打开GProfile的开关。</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2、<span style="color: rgb(75,78,81)">gprof只查看用户函数信息，不能对库函数进行查看。</span><span style="color: rgb(75,78,81)">&nbsp;如果想查看库函数的信息，在编译时加入"-lc_p"编译参数代替"-lc"编译参数，这样程序会链接libc_p.a库，就可以查看库函数的信息了。&nbsp;<br style="line-height: 22px" />　　3、 gprof只能在程序正常结束退出之后才能生成程序测评报告，原因是gprof通过在atexit()里注册了一个函数来产生结果信息，任何非正常退出都不会执行atexit()的动作，所以不会产生gmon.out文件。如果你的程序是一个不会退出的服务程序，那就只有修改代码来达到目的。如果不想改变程序的运行方式，可以添加一个信号处理函数解决问题（这样对代码修改最少），例如：&nbsp;<br style="line-height: 22px" />　　static void sighandler( int sig_no )&nbsp;<br style="line-height: 22px" />　　{&nbsp;<br style="line-height: 22px" />　　exit(0);&nbsp;<br style="line-height: 22px" />　　}&nbsp;<br style="line-height: 22px" />　　signal( SIGUSR1, sighandler )；&nbsp;<br style="line-height: 22px" />　　当使用kill -USR1 pid 后，程序退出，生成gmon.out文件。&nbsp;</span></p>
<p>&nbsp;</p>
<p><span style="color: rgb(75,78,81)">四、GProfile举例</p>
<div style="font-size: 13px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; border-bottom: #cccccc 1px solid; word-break: break-all; padding-bottom: 4px; padding-top: 4px; padding-left: 4px; border-left: #cccccc 1px solid; padding-right: 5px; width: 98%; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">stdio.h</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;ppp(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;a)&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img onclick="this.style.display='none'; Codehighlighter1_43_157_Open_Text.style.display='none'; Codehighlighter1_43_157_Closed_Image.style.display='inline'; Codehighlighter1_43_157_Closed_Text.style.display='inline';" id="Codehighlighter1_43_157_Open_Image" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img onclick="this.style.display='none'; Codehighlighter1_43_157_Closed_Text.style.display='none'; Codehighlighter1_43_157_Open_Image.style.display='inline'; Codehighlighter1_43_157_Open_Text.style.display='inline';" id="Codehighlighter1_43_157_Closed_Image" style="display: none" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif">&nbsp;&nbsp;</span><span id="Codehighlighter1_43_157_Closed_Text" style="border-top: #808080 1px solid; border-right: #808080 1px solid; border-bottom: #808080 1px solid; border-left: #808080 1px solid; display: none; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_43_157_Open_Text"><span style="color: #000000">{&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i,&nbsp;b;&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img onclick="this.style.display='none'; Codehighlighter1_110_134_Open_Text.style.display='none'; Codehighlighter1_110_134_Closed_Image.style.display='inline'; Codehighlighter1_110_134_Closed_Text.style.display='inline';" id="Codehighlighter1_110_134_Open_Image" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img onclick="this.style.display='none'; Codehighlighter1_110_134_Closed_Text.style.display='none'; Codehighlighter1_110_134_Open_Image.style.display='inline'; Codehighlighter1_110_134_Open_Text.style.display='inline';" id="Codehighlighter1_110_134_Closed_Image" style="display: none" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;i</span><span style="color: #000000">&lt;</span><span style="color: #000000">1000000</span><span style="color: #000000">;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">)&nbsp;</span><span id="Codehighlighter1_110_134_Closed_Text" style="border-top: #808080 1px solid; border-right: #808080 1px solid; border-bottom: #808080 1px solid; border-left: #808080 1px solid; display: none; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_110_134_Open_Text"><span style="color: #000000">{&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b</span><span style="color: #000000">++</span><span style="color: #000000">;&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;prime(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;n)&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img onclick="this.style.display='none'; Codehighlighter1_188_411_Open_Text.style.display='none'; Codehighlighter1_188_411_Closed_Image.style.display='inline'; Codehighlighter1_188_411_Closed_Text.style.display='inline';" id="Codehighlighter1_188_411_Open_Image" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img onclick="this.style.display='none'; Codehighlighter1_188_411_Closed_Text.style.display='none'; Codehighlighter1_188_411_Open_Image.style.display='inline'; Codehighlighter1_188_411_Open_Text.style.display='inline';" id="Codehighlighter1_188_411_Closed_Image" style="display: none" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif">&nbsp;&nbsp;</span><span id="Codehighlighter1_188_411_Closed_Text" style="border-top: #808080 1px solid; border-right: #808080 1px solid; border-bottom: #808080 1px solid; border-left: #808080 1px solid; display: none; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_188_411_Open_Text"><span style="color: #000000">{&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i,&nbsp;j,&nbsp;b;&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img onclick="this.style.display='none'; Codehighlighter1_250_404_Open_Text.style.display='none'; Codehighlighter1_250_404_Closed_Image.style.display='inline'; Codehighlighter1_250_404_Closed_Text.style.display='inline';" id="Codehighlighter1_250_404_Open_Image" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img onclick="this.style.display='none'; Codehighlighter1_250_404_Closed_Text.style.display='none'; Codehighlighter1_250_404_Open_Image.style.display='inline'; Codehighlighter1_250_404_Open_Text.style.display='inline';" id="Codehighlighter1_250_404_Closed_Image" style="display: none" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(i</span><span style="color: #000000">=</span><span style="color: #000000">2</span><span style="color: #000000">;&nbsp;i</span><span style="color: #000000">&lt;</span><span style="color: #000000">n;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">)&nbsp;</span><span id="Codehighlighter1_250_404_Closed_Text" style="border-top: #808080 1px solid; border-right: #808080 1px solid; border-bottom: #808080 1px solid; border-left: #808080 1px solid; display: none; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_250_404_Open_Text"><span style="color: #000000">{&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img onclick="this.style.display='none'; Codehighlighter1_290_324_Open_Text.style.display='none'; Codehighlighter1_290_324_Closed_Image.style.display='inline'; Codehighlighter1_290_324_Closed_Text.style.display='inline';" id="Codehighlighter1_290_324_Open_Image" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img onclick="this.style.display='none'; Codehighlighter1_290_324_Closed_Text.style.display='none'; Codehighlighter1_290_324_Open_Image.style.display='inline'; Codehighlighter1_290_324_Open_Text.style.display='inline';" id="Codehighlighter1_290_324_Closed_Image" style="display: none" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(j&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;j</span><span style="color: #000000">&lt;</span><span style="color: #000000">1000000</span><span style="color: #000000">;&nbsp;j</span><span style="color: #000000">++</span><span style="color: #000000">)&nbsp;</span><span id="Codehighlighter1_290_324_Closed_Text" style="border-top: #808080 1px solid; border-right: #808080 1px solid; border-bottom: #808080 1px solid; border-left: #808080 1px solid; display: none; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_290_324_Open_Text"><span style="color: #000000">{&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b</span><span style="color: #000000">++</span><span style="color: #000000">;&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(n</span><span style="color: #000000">%</span><span style="color: #000000">i&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">)&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;main(</span><span style="color: #0000ff">void</span><span style="color: #000000">)&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img onclick="this.style.display='none'; Codehighlighter1_443_605_Open_Text.style.display='none'; Codehighlighter1_443_605_Closed_Image.style.display='inline'; Codehighlighter1_443_605_Closed_Text.style.display='inline';" id="Codehighlighter1_443_605_Open_Image" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img onclick="this.style.display='none'; Codehighlighter1_443_605_Closed_Text.style.display='none'; Codehighlighter1_443_605_Open_Image.style.display='inline'; Codehighlighter1_443_605_Open_Text.style.display='inline';" id="Codehighlighter1_443_605_Closed_Image" style="display: none" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif">&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_443_605_Closed_Text" style="border-top: #808080 1px solid; border-right: #808080 1px solid; border-bottom: #808080 1px solid; border-left: #808080 1px solid; display: none; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_443_605_Open_Text"><span style="color: #000000">{&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i,&nbsp;n;&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1000</span><span style="color: #000000">;&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img onclick="this.style.display='none'; Codehighlighter1_509_580_Open_Text.style.display='none'; Codehighlighter1_509_580_Closed_Image.style.display='inline'; Codehighlighter1_509_580_Closed_Text.style.display='inline';" id="Codehighlighter1_509_580_Open_Image" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img onclick="this.style.display='none'; Codehighlighter1_509_580_Closed_Text.style.display='none'; Codehighlighter1_509_580_Open_Image.style.display='inline'; Codehighlighter1_509_580_Open_Text.style.display='inline';" id="Codehighlighter1_509_580_Closed_Image" style="display: none" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(i</span><span style="color: #000000">=</span><span style="color: #000000">2</span><span style="color: #000000">;&nbsp;i</span><span style="color: #000000">&lt;=</span><span style="color: #000000">n;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">)&nbsp;</span><span id="Codehighlighter1_509_580_Closed_Text" style="border-top: #808080 1px solid; border-right: #808080 1px solid; border-bottom: #808080 1px solid; border-left: #808080 1px solid; display: none; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_509_580_Open_Text"><span style="color: #000000">{&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img onclick="this.style.display='none'; Codehighlighter1_535_570_Open_Text.style.display='none'; Codehighlighter1_535_570_Closed_Image.style.display='inline'; Codehighlighter1_535_570_Closed_Text.style.display='inline';" id="Codehighlighter1_535_570_Open_Image" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img onclick="this.style.display='none'; Codehighlighter1_535_570_Closed_Text.style.display='none'; Codehighlighter1_535_570_Open_Image.style.display='inline'; Codehighlighter1_535_570_Open_Text.style.display='inline';" id="Codehighlighter1_535_570_Closed_Image" style="display: none" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(prime(i))&nbsp;</span><span id="Codehighlighter1_535_570_Closed_Text" style="border-top: #808080 1px solid; border-right: #808080 1px solid; border-bottom: #808080 1px solid; border-left: #808080 1px solid; display: none; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_535_570_Open_Text"><span style="color: #000000">{&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ppp(i);&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;</span></div>
<p></span></p>编译程序：gcc -pg -o test test.c 
<div style="mso-margin-left-alt: 296; mso-char-wrap: 1; mso-kinsoku-overflow: 1; mso-line-spacing: '80 20 0'"><span style="font-size: small"><span lang="X-NONE" style="font-family: 宋体; mso-ascii-font-family: Verdana; mso-fareast-font-family: 宋体; mso-hansi-font-family: Arial; mso-ansi-language: EN-US">&nbsp; 运行源程序</span><span lang="X-NONE" style="font-family: Verdana; mso-ascii-font-family: Verdana; mso-fareast-font-family: 宋体; mso-hansi-font-family: Arial; mso-ansi-language: EN-US">./test</span><span lang="X-NONE" style="font-family: 宋体; mso-ascii-font-family: Verdana; mso-fareast-font-family: 宋体; mso-hansi-font-family: Arial; mso-ansi-language: EN-US">后会生成一个</span><span lang="X-NONE" style="font-family: Verdana; mso-ascii-font-family: Verdana; mso-fareast-font-family: 宋体; mso-hansi-font-family: Arial; mso-ansi-language: EN-US">gmon.ou</span><span lang="EN-US" style="font-family: Verdana; mso-ascii-font-family: Verdana; mso-fareast-font-family: 宋体; mso-hansi-font-family: Arial; mso-fareast-language: ZH-CN">t</span><span lang="X-NONE" style="font-family: 宋体; mso-ascii-font-family: Verdana; mso-fareast-font-family: 宋体; mso-hansi-font-family: Arial; mso-ansi-language: EN-US">的文件</span><span lang="X-NONE" style="font-family: 宋体; mso-ascii-font-family: Verdana; mso-fareast-font-family: 宋体; mso-hansi-font-family: Arial; mso-ansi-language: EN-US">。 </span></span></div>
<div style="mso-margin-left-alt: 296; mso-char-wrap: 1; mso-kinsoku-overflow: 1; mso-line-spacing: '80 20 0'"><span lang="X-NONE" style="font-family: Verdana; mso-ascii-font-family: Verdana; mso-fareast-font-family: 宋体; mso-hansi-font-family: Arial; mso-ansi-language: EN-US"><span style="font-size: small">&nbsp;&nbsp; 分析结果：gprof -b test gmon.out </span></span></div>
<div style="mso-margin-left-alt: 296; mso-char-wrap: 1; mso-kinsoku-overflow: 1; mso-line-spacing: '80 20 0'"><span style="font-size: small">&nbsp;</span></div>
<p>&nbsp;&nbsp; <img alt="" src="http://hi.csdn.net/attachment/201103/25/0_13010327351Ww0.gif" width="533" height="415" /></p>
<p>&nbsp;</p>
<p>&nbsp;五、GProfile对于结果的分析</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(75,78,81)">-b 不再输出统计图表中每个字段的详细描述。&nbsp;<br style="line-height: 22px" />　　-p 只输出函数的调用图（Call graph的那部分信息）。&nbsp;<br style="line-height: 22px" />　　-q 只输出函数的时间消耗列表。&nbsp;<br style="line-height: 22px" />　　-e Name 不再输出函数Name 及其子函数的调用图（除非它们有未被限制的其它父函数）。可以给定多个 -e 标志。一个 -e 标志只能指定一个函数。&nbsp;<br style="line-height: 22px" />　　-E Name 不再输出函数Name 及其子函数的调用图，此标志类似于 -e 标志，但它在总时间和百分比时间的计算中排除了由函数Name 及其子函数所用的时间。&nbsp;<br style="line-height: 22px" />　　-f Name 输出函数Name 及其子函数的调用图。可以指定多个 -f 标志。一个 -f 标志只能指定一个函数。&nbsp;<br style="line-height: 22px" />　　-F Name 输出函数Name 及其子函数的调用图，它类似于 -f 标志，但它在总时间和百分比时间计算中仅使用所打印的例程的时间。可以指定多个 -F 标志。一个 -F 标志只能指定一个函数。-F 标志覆盖 -E 标志。&nbsp;<br style="line-height: 22px" />　　-z 显示使用次数为零的例程（按照调用计数和累积时间计算）。&nbsp;</span><br style="line-height: 22px" /></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GProfile的详细请参考：<a href="http://www.cs.utah.edu/dept/old/texinfo/as/gprof.html">http://www.cs.utah.edu/dept/old/texinfo/as/gprof.html</a></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这个文档对GProfile说的很详细，很好。</p><br /><img src ="http://www.cppblog.com/jackdongy/aggbug/193906.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jackdongy/" target="_blank">jackdong</a> 2012-10-26 15:41 <a href="http://www.cppblog.com/jackdongy/archive/2012/10/26/193906.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用Gnu gprof进行Linux平台下的程序分析 </title><link>http://www.cppblog.com/jackdongy/archive/2012/10/21/193598.html</link><dc:creator>jackdong</dc:creator><author>jackdong</author><pubDate>Sun, 21 Oct 2012 04:36:00 GMT</pubDate><guid>http://www.cppblog.com/jackdongy/archive/2012/10/21/193598.html</guid><wfw:comment>http://www.cppblog.com/jackdongy/comments/193598.html</wfw:comment><comments>http://www.cppblog.com/jackdongy/archive/2012/10/21/193598.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jackdongy/comments/commentRss/193598.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jackdongy/services/trackbacks/193598.html</trackback:ping><description><![CDATA[<a href="http://blog.csdn.net/bendanban/article/details/7742593">http://blog.csdn.net/bendanban/article/details/7742593</a><br />
<p>在网上找了找关于Progfile的工具，找到了这篇文章觉得不错，转来分享下。对原文修改了下。<br /></p>
<p>本文介绍了如何使用Gnu gprof 对Linux平台下的现有程序进行优化分析和生成程序调用图。主要偏重于对生成和使用流程图作介绍.</p><strong>Gprof 简介:<br /></strong>Gprof功能：打印出程序运行中各个函数消耗的时间，可以帮助程序员找出众多函数中耗时最多的函数。产生程序运行时候的函数调用关系，包括调用次数，可以帮助程序员分析程序的运行流程。<br />有了函数的调用关系，这会让开发人员大大提高工作效率，不用费心地去一点点找出程序的运行流程，这对小程序来说可能效果不是很明显，但对于有几万，几十万代码量的工程来说，效率是毋庸置疑的！而且这个功能对于维护旧代码或者是分析Open Source来说那是相当诱人的，有了调用图，对程序的运行框架也就有了一个大体了解，知道了程序的&#8220;骨架&#8220;，分析它也就不会再那么茫然，尤其是对自己不熟悉的代码和Open Source。费话不多说了，让我们开始我们的分析之旅吧！ 
<p><strong>Gprof 实现原理：</strong><br />通过在编译和链接你的程序的时候（使用 -pg 编译和链接选项），gcc 在你应用程序的每个函数中都加入了一个名为mcount ( or&nbsp; &#8220;_mcount&#8221;&nbsp; , or&nbsp; &#8220;__mcount&#8221; , 依赖于编译器或操作系统)的函数，也就是说你的应用程序里的每一个函数都会调用mcount, 而mcount 会在内存中保存一张函数调用图，并通过函数调用堆栈的形式查找子函数和父函数的地址。这张调用图也保存了所有与函数相关的调用时间，调用次数等等的所有信息。</p>
<p><em>Gprof基本用法：</em><br />1． 使用 -pg 编译和链接你的应用程序。</p>
<p>2． 执行你的应用程序使之生成供gprof 分析的数据。</p>
<p>3． 使用gprof 程序分析你的应用程序生成的数据。</p>
<p><em>Gprof 简单使用：</em><br />让我们简单的举个例子来看看Gprof是如何使用的。</p>1．打开linux终端。新建一个test.c文件，并生用-pg 编译和链接该文件。 test.c 文件内容如下： 
<div style="font-size: 13px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; border-bottom: #cccccc 1px solid; word-break: break-all; padding-bottom: 4px; padding-top: 4px; padding-left: 4px; border-left: #cccccc 1px solid; padding-right: 5px; width: 98%; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #000000">#include&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">stdio.h</span><span style="color: #000000">"</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />#include&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">stdlib.h</span><span style="color: #000000">"</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;a()<br /><img onclick="this.style.display='none'; Codehighlighter1_48_94_Open_Text.style.display='none'; Codehighlighter1_48_94_Closed_Image.style.display='inline'; Codehighlighter1_48_94_Closed_Text.style.display='inline';" id="Codehighlighter1_48_94_Open_Image" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img onclick="this.style.display='none'; Codehighlighter1_48_94_Closed_Text.style.display='none'; Codehighlighter1_48_94_Open_Image.style.display='inline'; Codehighlighter1_48_94_Open_Text.style.display='inline';" id="Codehighlighter1_48_94_Closed_Image" style="display: none" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span id="Codehighlighter1_48_94_Closed_Text" style="border-top: #808080 1px solid; border-right: #808080 1px solid; border-bottom: #808080 1px solid; border-left: #808080 1px solid; display: none; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_48_94_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">\t\t+---call&nbsp;a()&nbsp;function\n</span><span style="color: #000000">"</span><span style="color: #000000">);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;c()<br /><img onclick="this.style.display='none'; Codehighlighter1_105_151_Open_Text.style.display='none'; Codehighlighter1_105_151_Closed_Image.style.display='inline'; Codehighlighter1_105_151_Closed_Text.style.display='inline';" id="Codehighlighter1_105_151_Open_Image" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img onclick="this.style.display='none'; Codehighlighter1_105_151_Closed_Text.style.display='none'; Codehighlighter1_105_151_Open_Image.style.display='inline'; Codehighlighter1_105_151_Open_Text.style.display='inline';" id="Codehighlighter1_105_151_Closed_Image" style="display: none" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span id="Codehighlighter1_105_151_Closed_Text" style="border-top: #808080 1px solid; border-right: #808080 1px solid; border-bottom: #808080 1px solid; border-left: #808080 1px solid; display: none; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_105_151_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">\t\t+---call&nbsp;c()&nbsp;function\n</span><span style="color: #000000">"</span><span style="color: #000000">);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;b()<br /><img onclick="this.style.display='none'; Codehighlighter1_161_231_Open_Text.style.display='none'; Codehighlighter1_161_231_Closed_Image.style.display='inline'; Codehighlighter1_161_231_Closed_Text.style.display='inline';" id="Codehighlighter1_161_231_Open_Image" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img onclick="this.style.display='none'; Codehighlighter1_161_231_Closed_Text.style.display='none'; Codehighlighter1_161_231_Open_Image.style.display='inline'; Codehighlighter1_161_231_Open_Text.style.display='inline';" id="Codehighlighter1_161_231_Closed_Image" style="display: none" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span id="Codehighlighter1_161_231_Closed_Text" style="border-top: #808080 1px solid; border-right: #808080 1px solid; border-bottom: #808080 1px solid; border-left: #808080 1px solid; display: none; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_161_231_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">\t+---&nbsp;call&nbsp;b()&nbsp;function\n</span><span style="color: #000000">"</span><span style="color: #000000">);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;a();<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;c();<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;main()<br /><img onclick="this.style.display='none'; Codehighlighter1_245_289_Open_Text.style.display='none'; Codehighlighter1_245_289_Closed_Image.style.display='inline'; Codehighlighter1_245_289_Closed_Text.style.display='inline';" id="Codehighlighter1_245_289_Open_Image" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img onclick="this.style.display='none'; Codehighlighter1_245_289_Closed_Text.style.display='none'; Codehighlighter1_245_289_Open_Image.style.display='inline'; Codehighlighter1_245_289_Open_Text.style.display='inline';" id="Codehighlighter1_245_289_Closed_Image" style="display: none" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span id="Codehighlighter1_245_289_Closed_Text" style="border-top: #808080 1px solid; border-right: #808080 1px solid; border-bottom: #808080 1px solid; border-left: #808080 1px solid; display: none; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_245_289_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;main()&nbsp;function()\n</span><span style="color: #000000">"</span><span style="color: #000000">);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;b();<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span></div><br />命令行里面输入下面命令，没加-c选项，gcc 会默认进行编译并链接生成a.out： 
<div style="font-size: 13px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; border-bottom: #cccccc 1px solid; word-break: break-all; padding-bottom: 4px; padding-top: 4px; padding-left: 4px; border-left: #cccccc 1px solid; padding-right: 5px; width: 98%; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #000000">$gcc&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">pg&nbsp;test.c</span></div><br />如果没有编译错误，gcc会在当前目录下生成一个a.out文件，当然你也可以使用 &#8211;o 选项给生成的文件起一个别的名字，像 gcc &#8211;pg test.c &#8211;o test , 则gcc会生成一个名为test的可执行文件,在命令行下输入[linux /home/test]$./test , 就可以执行该程序了，记住一定要加上 ./ 否则程序看上去可能是执行，可是什么输出都没有。 
<p>&nbsp;</p>
<p>2．执行你的应用程序使之生成供gprof 分析的数据。&nbsp; 命令行里面输入:</p>
<div style="font-size: 13px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; border-bottom: #cccccc 1px solid; word-break: break-all; padding-bottom: 4px; padding-top: 4px; padding-left: 4px; border-left: #cccccc 1px solid; padding-right: 5px; width: 98%; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #000000">[linux&nbsp;</span><span style="color: #000000">/</span><span style="color: #000000">home</span><span style="color: #000000">/</span><span style="color: #000000">test]$a.</span><span style="color: #0000ff">out</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />main()&nbsp;function()<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">+---</span><span style="color: #000000">&nbsp;call&nbsp;b()&nbsp;function<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">+---</span><span style="color: #000000">call&nbsp;a()&nbsp;function<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">+---</span><span style="color: #000000">call&nbsp;c()&nbsp;function</span></div>
<p>你会在当前目录下看到一个gmon.out 文件， 这个文件就是供gprof 分析使用的。 </p>
<p>&nbsp;</p>
<p>3．使用gprof 程序分析你的应用程序生成的数据。<br />命令行里面输入:</p>
<p>&nbsp;</p>
<div style="font-size: 13px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; border-bottom: #cccccc 1px solid; word-break: break-all; padding-bottom: 4px; padding-top: 4px; padding-left: 4px; border-left: #cccccc 1px solid; padding-right: 5px; width: 98%; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #000000">$&nbsp;gprof&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">b&nbsp;a.</span><span style="color: #0000ff">out</span><span style="color: #000000">&nbsp;gmon.</span><span style="color: #0000ff">out</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">|</span><span style="color: #000000">&nbsp;less</span></div>
<p>由于gprof输出的信息比较多，这里使用了 less 命令，该命令可以让我们通过上下方向键查看gprof产生的输出，| 表示gprof -b a.out gmon.out 的输出作为 less的输入。下面是我从gprof输出中摘抄出的与我们有关的一些详细信息。</p>
<div style="font-size: 13px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; border-bottom: #cccccc 1px solid; word-break: break-all; padding-bottom: 4px; padding-top: 4px; padding-left: 4px; border-left: #cccccc 1px solid; padding-right: 5px; width: 98%; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #000000">%</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cumulative&nbsp;&nbsp;&nbsp;&nbsp;self&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;total<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />time&nbsp;&nbsp;&nbsp;seconds&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;seconds&nbsp;&nbsp;&nbsp;&nbsp;calls&nbsp;&nbsp;Ts</span><span style="color: #000000">/</span><span style="color: #000000">call&nbsp;&nbsp;Ts</span><span style="color: #000000">/</span><span style="color: #000000">call&nbsp;&nbsp;name<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">0.00</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">0.00</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">0.00</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">0.00</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">0.00</span><span style="color: #000000">&nbsp;&nbsp;a<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">0.00</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">0.00</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">0.00</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">0.00</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">0.00</span><span style="color: #000000">&nbsp;&nbsp;b<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">0.00</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">0.00</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">0.00</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">0.00</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">0.00</span><span style="color: #000000">&nbsp;&nbsp;c<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />Call&nbsp;graph<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />granularity:&nbsp;each&nbsp;sample&nbsp;hit&nbsp;covers&nbsp;</span><span style="color: #000000">4</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">(s)&nbsp;no&nbsp;time&nbsp;propagated<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />index&nbsp;</span><span style="color: #000000">%</span><span style="color: #000000">&nbsp;time&nbsp;&nbsp;&nbsp;&nbsp;self&nbsp;&nbsp;children&nbsp;&nbsp;&nbsp;&nbsp;called&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">0.00</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">0.00</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">/</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;[</span><span style="color: #000000">2</span><span style="color: #000000">]<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />[</span><span style="color: #000000">1</span><span style="color: #000000">]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">0.0</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">0.00</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">0.00</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;[</span><span style="color: #000000">1</span><span style="color: #000000">]<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">-----------------------------------------------</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">0.00</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">0.00</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">/</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;main&nbsp;[</span><span style="color: #000000">10</span><span style="color: #000000">]<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />[</span><span style="color: #000000">2</span><span style="color: #000000">]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">0.0</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">0.00</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">0.00</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;[</span><span style="color: #000000">2</span><span style="color: #000000">]<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">0.00</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">0.00</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">/</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;[</span><span style="color: #000000">1</span><span style="color: #000000">]<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">0.00</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">0.00</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">/</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c&nbsp;[</span><span style="color: #000000">3</span><span style="color: #000000">]<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">-----------------------------------------------</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">0.00</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">0.00</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">/</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;[</span><span style="color: #000000">2</span><span style="color: #000000">]<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />[</span><span style="color: #000000">3</span><span style="color: #000000">]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">0.0</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">0.00</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">0.00</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c&nbsp;[</span><span style="color: #000000">3</span><span style="color: #000000">]</span></div>
<p>从上面的输出我们能明显的看出来，main 调用了 b 函数， 而b 函数分别调用了a 和 c 函数。由于我们的函数只是简单的输出了一个字串，故每个函数的消耗时间都是0 秒。 </p>
<p>&nbsp;</p>
<p><br /><strong>常用的Gprof 命令选项解释：</strong> </p>
<p>-b不再输出统计图表中每个字段的详细描述。 </p>
<p>-p 只输出函数的调用图（Call graph 的那部分信息）。</p>
<p>-q 只输出函数的时间消耗列表。</p>
<p>-E Name不再输出函数Name 及其子函数的调用图，此标志类似于 -e 标志，但它在总时间和百分比时间的计算中排除了由函数Name 及其子函数所用的时间。</p>
<p>-e Name 不再输出函数Name 及其子函数的调用图（除非它们有未被限制的其它父函数）。可以给定多个 -e 标志。一个 -e 标志只能指定一个函数。 </p>
<p>-F Name 输出函数Name 及其子函数的调用图，它类似于 -f 标志，但它在总时间和百分比时间计算中仅使用所打印的例程的时间。可以指定多个 -F 标志。一个 -F 标志只能指定一个函数。-F 标志覆盖 -E 标志。 </p>
<p>-f Name输出函数Name 及其子函数的调用图。可以指定多个 -f 标志。一个 -f 标志只能指定一个函数。 </p>
<p>-z 显示使用次数为零的例程（按照调用计数和累积时间计算）。</p>
<p>到这为止你可能对gprof 有了一个比较感性的认识了，你可能会问如何用它去分析一个真正的Open Source 呢！下面就让我们去用gprof去分析一个Open Source，看看如何去在真实的环境中使用它。</p>
<p><strong>使用Gprof 分析 Cflow开源项目</strong><br />CFlow 是程序流程分析工具，该工具可以通过分析C源代码，产生程序调用图！有点跟Gprof差不多，不过CFlow是通过源代码进行的静态分析并且 不能分析C++ 程序,你可以到<a href="http://www.gnu.org/software/cflow/">http://www.gnu.org/software/cflow/</a>去下载源代码。</p>
<p>假设你已经下载了该源代码（cflow-1.1.tar.gz）,并把它放置在/home目录下，让我们看看如何在这个应用上使用gprof。 </p>
<p>1．&nbsp;使用 -pg 编译和链接该应用程序,请输入下列命令。</p>
<p>&nbsp;</p><pre>[linux /home/]tar zxvf cflow-1.1.tar.gz
[linux /home/cflow-1.1/src]$./configure
[linux /home]$make CFLAGS=-pg LDFLAGS=-pg </pre>
<p>如果没有出错你会在/home/cflow-1.1/src 目录下发行一个名为cflow的可执行文件，这就是我们加入-pg编译选项后编译出来的可以产生供gprof提取信息的可执行文件。<strong><span style="color: rgb(255,0,0)">记住一定要在编译和链接的时候都使用-pg选项</span></strong>，否则可能不会产生gmon.out文件。对于cflow项目，CFLAGS=-pg 是设置它的编译选项，LDFLAGS=-pg是设置它的链接选项。当然你也可以直接修改它的Makefile来达到上述相同的目的，不过一定要记住编译和链接都要使用-pg选项。 </p>
<p>&nbsp;</p>
<p>2．&nbsp;运行cflow 程序使之生成gmon.out 文件供gprof使用。 <br /></p>
<p>&nbsp;</p><pre>[linux /home/cflow-1.1/src]$cflow parser.c</pre>
<p>查看/home/cflow-1.1/src目录下有没有产生gmon.out文件，如果没有请重复第一步，并确认你已经在编译和链接程序的时候使用了-pg 选项。Cflow的使用请参考<a href="http://www.gnu.org/software/cflow/manual/cflow.html">http://www.gnu.org/software/cflow/manual/cflow.html</a>。 </p>
<p>&nbsp;</p>
<p>3．&nbsp;使用gprof分析程序<br />[linux /home/cflow-1.1/src]$gprof -b cflow gmon.out | less<br />恭喜你，不出意外你会在屏幕上看到gprof的输出，函数消耗时间和函数调用图，下面是我从我的输出中摘抄出来的一小段。</p>
<p>&nbsp;</p><pre><p>%&nbsp;&nbsp; cumulative&nbsp;&nbsp; self&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self&nbsp;&nbsp;&nbsp;&nbsp; total
time&nbsp;&nbsp; seconds&nbsp;&nbsp; seconds&nbsp;&nbsp;&nbsp; calls&nbsp; Ts/call&nbsp; Ts/call&nbsp; name
0.00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.00&nbsp;&nbsp;&nbsp;&nbsp; 0.00&nbsp;&nbsp; 118262&nbsp;&nbsp;&nbsp;&nbsp; 0.00&nbsp;&nbsp;&nbsp;&nbsp; 0.00&nbsp; include_symbol
0.00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.00&nbsp;&nbsp;&nbsp;&nbsp; 0.00&nbsp;&nbsp;&nbsp; 92896&nbsp;&nbsp;&nbsp;&nbsp; 0.00&nbsp;&nbsp;&nbsp;&nbsp; 0.00&nbsp; is_printable
0.00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.00&nbsp;&nbsp;&nbsp;&nbsp; 0.00&nbsp;&nbsp;&nbsp; 28704&nbsp;&nbsp;&nbsp;&nbsp; 0.00&nbsp;&nbsp;&nbsp;&nbsp; 0.00&nbsp; set_level_mark
0.00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.00&nbsp;&nbsp;&nbsp;&nbsp; 0.00&nbsp;&nbsp;&nbsp; 28703&nbsp;&nbsp;&nbsp;&nbsp; 0.00&nbsp;&nbsp;&nbsp;&nbsp; 0.00&nbsp; is_last
0.00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.00&nbsp;&nbsp;&nbsp;&nbsp; 0.00&nbsp;&nbsp;&nbsp; 19615&nbsp;&nbsp;&nbsp;&nbsp; 0.00&nbsp;&nbsp;&nbsp;&nbsp; 0.00&nbsp; auto_processor
0.00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.00&nbsp;&nbsp;&nbsp;&nbsp; 0.00&nbsp;&nbsp;&nbsp; 15494&nbsp;&nbsp;&nbsp;&nbsp; 0.00&nbsp;&nbsp;&nbsp;&nbsp; 0.00&nbsp; gnu_output_handler
0.00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.00&nbsp;&nbsp;&nbsp;&nbsp; 0.00&nbsp;&nbsp;&nbsp; 12286&nbsp;&nbsp;&nbsp;&nbsp; 0.00&nbsp;&nbsp;&nbsp;&nbsp; 0.00&nbsp; delete_parm_processor
0.00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.00&nbsp;&nbsp;&nbsp;&nbsp; 0.00&nbsp;&nbsp;&nbsp;&nbsp; 7728&nbsp;&nbsp;&nbsp;&nbsp; 0.00&nbsp;&nbsp;&nbsp;&nbsp; 0.00&nbsp; newline
0.00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.00&nbsp;&nbsp;&nbsp;&nbsp; 0.00&nbsp;&nbsp;&nbsp;&nbsp; 7728&nbsp;&nbsp;&nbsp;&nbsp; 0.00&nbsp;&nbsp;&nbsp;&nbsp; 0.00&nbsp; print_function_name
0.00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.00&nbsp;&nbsp;&nbsp;&nbsp; 0.00&nbsp;&nbsp;&nbsp;&nbsp; 7728&nbsp;&nbsp;&nbsp;&nbsp; 0.00&nbsp;&nbsp;&nbsp;&nbsp; 0.00&nbsp; print_level</p><p>。。。。。。
。。。。。。</p><p>Call graph</p><p>granularity: each sample hit covers 4 byte(s) no time propagated</p><p>index % time&nbsp;&nbsp;&nbsp; self&nbsp; children&nbsp;&nbsp; called&nbsp;&nbsp;&nbsp;&nbsp; name
[1]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.0&nbsp;&nbsp;&nbsp; 0.00&nbsp;&nbsp;&nbsp; 0.00&nbsp;&nbsp;&nbsp;&nbsp; 79+855&nbsp;  [1]
0.00&nbsp;&nbsp;&nbsp; 0.00&nbsp;&nbsp;&nbsp; 166&nbsp;&nbsp;&nbsp;&nbsp; dcl  [52]
0.00&nbsp;&nbsp;&nbsp; 0.00&nbsp;&nbsp;&nbsp; 163&nbsp;&nbsp;&nbsp;&nbsp; parse_dcl  [53]
0.00&nbsp;&nbsp;&nbsp; 0.00&nbsp;&nbsp;&nbsp; 150&nbsp;&nbsp;&nbsp;&nbsp; dirdcl  [56]
0.00&nbsp;&nbsp;&nbsp; 0.00&nbsp;&nbsp;&nbsp; 129&nbsp;&nbsp;&nbsp;&nbsp; parse_declaration  [63]
0.00&nbsp;&nbsp;&nbsp; 0.00&nbsp;&nbsp;&nbsp;&nbsp; 98&nbsp;&nbsp;&nbsp;&nbsp; parse_variable_declaration  [66]
0.00&nbsp;&nbsp;&nbsp; 0.00&nbsp;&nbsp;&nbsp;&nbsp; 63&nbsp;&nbsp;&nbsp;&nbsp; maybe_parm_list  [69]
0.00&nbsp;&nbsp;&nbsp; 0.00&nbsp;&nbsp;&nbsp;&nbsp; 63&nbsp;&nbsp;&nbsp; parse_function_declaration  [70]
0.00&nbsp;&nbsp;&nbsp; 0.00&nbsp;&nbsp;&nbsp;&nbsp; 39&nbsp;&nbsp;&nbsp; func_body  [74]</p><p>。。。。。。
。。。。。。</p></pre>
<p>&nbsp;</p>
<p><br /></p>
<p>通过分析％time你就知道了那个函数消耗的时间最多，你可以根据这个输出信息做有目的的优化，不过cflow执行的速度是在是太快了，以至％time都是0 (消耗时间是以秒为单位进行统计的)。 </p>
<p>&nbsp;</p>
<p><strong>生成图形化的函数调用图</strong></p>
<p>1．Graphviz 工具<br />看到这里你也可能觉得上面的函数调用图实在是不方便察看，也看不出来一个程序调用的整体框架。没有关系，我再介绍一个有用的工具给你，使用 Graphviz，Graphviz or Graph Visualization 是由 AT&amp;T 开发的一个开源的图形可视化工具。它提供了多种画图能力，但是我们重点关注的是它使用 Dot 语言直连图的能力。在这里，将简单介绍如何使用 Dot 来创建一个图形，并展示如何将分析数据转换成 Graphviz 可以使用的规范, Dot 使用的图形规范。 </p>
<p>使用 Dot 语言，你可以指定三种对象：图、节点和边。为了让你理解这些对象的含义，我将构建一个例子来展示这些元素的用法。</p>
<p><br />下图给出了一个简单的定向图（directed graph），其中包含 3 个节点。第一行声明这个图为 G，并且声明了该图的类型（digraph）。接下来的三行代码用于创建该图的节点，这些节点分别名为 node1、node2 和 node3。节点是在它们的名字出现在图规范中时创建的。边是在在两个节点使用边操作（-&gt;）连接在一起时创建的，如第 6 行到第 8 行所示。我还对边使用了一个可选的属性 label，用它来表示边在图中的名称。最后，在第 9 行完成对该图规范的定义。<br />使用 Dot 符号表示的示例图（test.dot）</p>
<p>&nbsp;</p>
<div style="font-size: 13px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; border-bottom: #cccccc 1px solid; word-break: break-all; padding-bottom: 4px; padding-top: 4px; padding-left: 4px; border-left: #cccccc 1px solid; padding-right: 5px; width: 98%; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img onclick="this.style.display='none'; Codehighlighter1_10_164_Open_Text.style.display='none'; Codehighlighter1_10_164_Closed_Image.style.display='inline'; Codehighlighter1_10_164_Closed_Text.style.display='inline';" id="Codehighlighter1_10_164_Open_Image" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img onclick="this.style.display='none'; Codehighlighter1_10_164_Closed_Text.style.display='none'; Codehighlighter1_10_164_Open_Image.style.display='inline'; Codehighlighter1_10_164_Open_Text.style.display='inline';" id="Codehighlighter1_10_164_Closed_Image" style="display: none" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"><span style="color: #000000">digraph&nbsp;G&nbsp;</span><span id="Codehighlighter1_10_164_Closed_Text" style="border-top: #808080 1px solid; border-right: #808080 1px solid; border-bottom: #808080 1px solid; border-left: #808080 1px solid; display: none; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_10_164_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;node1;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;node2;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;node3;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;node1&nbsp;</span><span style="color: #000000">-&gt;</span><span style="color: #000000">&nbsp;node2&nbsp;[label</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">edge_1_2</span><span style="color: #000000">"</span><span style="color: #000000">];<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;node1&nbsp;</span><span style="color: #000000">-&gt;</span><span style="color: #000000">&nbsp;node3&nbsp;[label</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">edge_1_3</span><span style="color: #000000">"</span><span style="color: #000000">];<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;node2&nbsp;</span><span style="color: #000000">-&gt;</span><span style="color: #000000">&nbsp;node3&nbsp;[label</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">edge_2_3</span><span style="color: #000000">"</span><span style="color: #000000">];<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />&nbsp;}</span></span></div>
<p>要将这个 .dot 文件转换成一个图形映像，则需要使用 Dot 工具，这个工具是在 Graphviz 包中提供的。清单 6 介绍了这种转换。<br />清单 6. 使用 Dot 来创建 JPG 映像<br />[linux /home]$ dot -Tjpg test.dot -o test.jpg<br />在这段代码中，我告诉 Dot 使用 test.dot 图形规范，并生成一个 JPG 图像，将其保存在文件 test.jpg 中。所生成的图像如图1所示。在此处，我使用了 JPG 格式，但是 Dot 工具也可以支持其他格式，其中包括 GIF、PNG 和 postscript等等。 </p>
<p>&nbsp;</p>
<p><img alt="" align="middle" src="http://img.my.csdn.net/uploads/201207/13/1342142603_8136.jpg" /><br /></p>
<p>Dot创建的实例图</p>
<p>Dot 语言还可以支持其他一些选项，包括外形、颜色和很多属性。有兴趣可以查看graphviz相关文档。<br />2．从gprof的输出中提取调用图信息，产生可供Graphviz使用的dot文件。<br />这样的脚本有人已经实现了，我们只要下载一个现成的就可以了，首先从<a href="http://www.ioplex.com/~miallen/">http://www.ioplex.com/~miallen/</a> 网站下载一个mkgraph脚本。解压该脚本到包含gmon.out文件的目录下。使用mkgraph0.sh产生调用的jpg图像文件。例如：使用上面的例子，生成cflow的调用图。<br />[linux /home/cflow-1.1/src]$ mkgraph0.sh cflow gmon.out<br />部分调用图如下，有了这个图是不是对程序整体框架有了个清晰地了解，如果你对生成的调用图效果不满意，你还可以通过修改mkgraph0脚本使之产生合适的dot文件即可：<br /></p>
<p><strong>总结：</strong><br />使用gprof , Graphviz , mkgraph 生成函数调用图<br />1． 使用 -pg 编译和链接你的应用程序。<br />2． 执行你的应用程序使之生成供gprof 分析的数据。<br />3． 使用mkgraph脚本生成图形化的函数调用图。</p>
<p><strong>相关资料：</strong><br />文档：用 Graphviz 可视化函数调用<br />文档：Speed your code with the GNU profiler<br />文档：gropf 帮助文件<br />Mkgraph 脚本：<a href="http://www.ioplex.com/~miallen/">http://www.ioplex.com/~miallen/</a><br />Graphviz 工具：<a href="http://www.graphviz.org/">http://www.graphviz.org</a><br />Cflow&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ：<a href="http://www.gnu.org/software/cflow/">http://www.gnu.org/software/cflow/</a><br />（责任编辑：<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#119;&#97;&#110;&#103;&#99;&#103;&#64;&#53;&#49;&#99;&#116;&#111;&#46;&#99;&#111;&#109;">城尘</a>&nbsp;68476636-8003）</p>
<p>原文地址：<a href="http://os.51cto.com/art/200703/41426_2.htm">点击打开链接</a>http://os.51cto.com/art/200703/41426_2.htm <br /><br /><br /><br /></p><br /><br /><br /><br /><br /><img src ="http://www.cppblog.com/jackdongy/aggbug/193598.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jackdongy/" target="_blank">jackdong</a> 2012-10-21 12:36 <a href="http://www.cppblog.com/jackdongy/archive/2012/10/21/193598.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>