C調試方法之--------Gprofile

一、GProfile簡介

      GProfile是gcc的一個工具,用於對應用程序的測試。

      GProfile可以分析出函數的調用次數、函數的調用關係以及函數消耗的時間。

 

二、GProfile原理

      在編譯和鏈接你的程序的時候,gcc 在你應用程序的每個函數中都加入了一個名爲mcount ( or "_mcount" , or "__mcount" , 依賴於編譯器或操作系統)的函數,也就是說你的應用程序裏的每一個函數都會調用mcount, 而mcount 會在內存中保存一張函數調用圖,並通過函數調用堆棧的形式查找子函數和父函數的地址。這張調用圖也保存了所有與函數相關的調用時間,調用次數等等的所有信息。 

     程序運行結束後,會在程序退出的路徑下生成一個gmon.out文件,用來保存監控數據。從而通過gprof來解讀數據對程序進行分析。

          

三、GProfile用法

      1、在編譯時加入參數 -pg就可以打開GProfile的開關。

      2、gprof只查看用戶函數信息,不能對庫函數進行查看。 如果想查看庫函數的信息,在編譯時加入"-lc_p"編譯參數代替"-lc"編譯參數,這樣程序會鏈接libc_p.a庫,就可以查看庫函數的信息了。 
  3、 gprof只能在程序正常結束退出之後才能生成程序測評報告,原因是gprof通過在atexit()裏註冊了一個函數來產生結果信息,任何非正常退出都不會執行atexit()的動作,所以不會產生gmon.out文件。如果你的程序是一個不會退出的服務程序,那就只有修改代碼來達到目的。如果不想改變程序的運行方式,可以添加一個信號處理函數解決問題(這樣對代碼修改最少),例如: 
  static void sighandler( int sig_no ) 
  { 
  exit(0); 
  } 
  signal( SIGUSR1, sighandler ); 
  當使用kill -USR1 pid 後,程序退出,生成gmon.out文件。 

 

四、GProfile舉例

     

#include <stdio.h>
  int ppp(int a)
  {
     int i, b;
     b = 0;
     for(i = 0; i<1000000; i++) {
        b++;
     }
     return 0;
  }

 

  int prime(int n)
  {
     int i, j, b;
     b = 0;
     for(i=2; i<n; i++) {
         for(j = 0; j<1000000; j++) {
              b++;
         }
         if(n%i == 0)
           return 0;
         return 1;
        }
   }

 

   int main(void)
   {
      int i, n;
      n = 1000;
      for(i=2; i<=n; i++) {
         if(prime(i)) {
            ppp(i);
         }
      }
      return 0;
   }

 

   編譯程序:gcc -pg -o test test.c
  運行源程序./test後會生成一個gmon.out的文件。
   分析結果:gprof -b test gmon.out
 

  

 

 五、GProfile對於結果的分析

      -b 不再輸出統計圖表中每個字段的詳細描述。 
  -p 只輸出函數的調用圖(Call graph的那部分信息)。 
  -q 只輸出函數的時間消耗列表。 
  -e Name 不再輸出函數Name 及其子函數的調用圖(除非它們有未被限制的其它父函數)。可以給定多個 -e 標誌。一個 -e 標誌只能指定一個函數。 
  -E Name 不再輸出函數Name 及其子函數的調用圖,此標誌類似於 -e 標誌,但它在總時間和百分比時間的計算中排除了由函數Name 及其子函數所用的時間。 
  -f Name 輸出函數Name 及其子函數的調用圖。可以指定多個 -f 標誌。一個 -f 標誌只能指定一個函數。 
  -F Name 輸出函數Name 及其子函數的調用圖,它類似於 -f 標誌,但它在總時間和百分比時間計算中僅使用所打印的例程的時間。可以指定多個 -F 標誌。一個 -F 標誌只能指定一個函數。-F 標誌覆蓋 -E 標誌。 
  -z 顯示使用次數爲零的例程(按照調用計數和累積時間計算)。 

      GProfile的詳細請參考:http://www.cs.utah.edu/dept/old/texinfo/as/gprof.html

      這個文檔對GProfile說的很詳細,很好。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章