gprof コマンド

目的

コール・グラフのプロファイル・データを表示します。

構文

/usr/ccs/bin/gprof [ -b ] [ -c [ filename ] ] [ -e Name ] [ -E Name ] [ -f Name ] [-g filename ] [-i filename] [-p filename ] [ -F Name ] [ -L PathName ] [ -s ] [ -x [ filename ] ] [ -z ] [ a.out [ gmon.out ... ] ]

説明

gprof コマンドは、C、FORTRAN、または COBOL の各プログラムの実行プロファイルを生成します。 呼び出されたルーチンの効果は、各呼び出し元のプロファイルに組み込まれます。 gprof コマンドは、プログラムがどのようにプロセッサー・リソースを使用するかを決定するときに役立ちます。プログラム内のどの関数 (ルーチン) によってプロセッサーが使用されているかを確認するには、gprof コマンドを使ってプログラムのプロファイルを作成します。

プロファイル・データは、-pg オプションを使用している cc コマンドを使ってコンパイルしたプログラムによって作成されたコール・グラフ・プロファイル・ファイル (デフォルトでは gmon.out) から取り出されます。また、-pg オプションでは、プロファイル作成のためにコンパイルしたバージョンのライブラリー・ルーチンにリンクし、名前付きオブジェクト・ファイル (デフォルトでは a.out) 内の記号テーブルを読み取って、コール・グラフのプロファイル・ファイルと相関関係を持たせます。複数のプロファイル・ファイルを指定すると、gprof コマンド出力に、指定したプロファイル・ファイル内のプロファイル情報がすべて示されます。

-pg オプションを指定すると、 コンパイラーによって、mcount サブルーチンの呼び出しが、 プログラムの各再コンパイル関数ごとに生成されたオブジェクト・コードに挿入されます。プログラム実行中に親が子関数を呼び出すたびに、 子は mcount サブルーチンを呼び出して、 その親子の対の独立カウンターを増分させます。 -pg オプションを使用して再コンパイルしなかったプログラムには、mcount サブルーチンがないので、呼び出し元の記録は残りません。
注: C++ オブジェクト・ファイル名からのシンボルは、使用する前に変更されます。
GPROF 環境変数を使用して、プロファイル作成のために異なるオプションを設定できます。 この環境変数の構文は、以下のように定義されています。
GPROF = profile:<profile-type>,scale:<scaling-factor>,file:<file-type>,filename:<filename>
それぞれの意味は次のとおりです。
  • <profile-type> は、どのようなタイプのプロファイル作成が必要であるかを記述します。これは、process または thread のいずれかです。タイプ「process」はプロファイル作成の細分度がプロセス・レベルであることを指示 し、「thread」はプロファイル作成の細分度がスレッド・レベルであることを指示します。
  • <scaling-factor> は、コール・グラフのプロファイルに割り振る必要のあるメモリー量を記述します。デフォルトでは、プロセス・レベルのプロファイル作成では倍率 2、スレッド・レベルのプロファイル作成では倍率 8 です。この倍率を 2 にするとプロセス・サイズの半分のメモリーが各プロセスまたはスレッドに割り振られ、また、8 にするとプロセス・サイズの 1/8 のメモリーが各プロセスまたはスレッドに割り振られるという指示になります。このメモリーは、コール・グラフ情報を保管するためのバッファー域です。
  • <file-type> は、必要とする gmon.out ファイルのタイプを記述します。multi という値はプロセスごとに 1 gmon.out ファイルが必要であることを指定し、multithread という値はスレッドごとに 1 gmon.out ファイルが必要であることを指定します。アプリケーションが -pg オプションを指定してプロファイルが作成されていて、fork を行う場合は、multi の指定によって、親プロセスのために 1 つの gmon.out ファイルが、子プロセスのためにもう 1 つのファイルが生成されます。生成される gmon.out ファイルの命名規則は、以下のとおりです。
    • multi ファイル・タイプの場合: <prefix>-processname-pid.out
    • multithread ファイル・タイプの場合: <prefix>-processname-pid-Pthread<threadid>.out
    <prefix> はデフォルトでは gmon です。 GPROF 環境変数の filename パラメーターを使用して、独自のプレフィックスを定義できます。
  • <filename> は、生成される gmon.out ファイルに使用する必要のあるプレフィックスを記述します。デフォルトでは、プレフィックスは gmon です。
注: profile:thread に よって、フォーマット gmon.out ファイルが生成されます。 このファイルは AIX® 5.3 gprof コマンドによってのみ読むことができます。 旧フォーマットの gmon.out ファイルが必要で、しかも、profile:thread を指定したい場合は、file:multithread を指定する必要があります。これによって、旧フォーマットの gmon.out ファイルがスレッドごとに生成されます。したがって、アプリケーションに 2 つのスレッドがあれば、命名規則を使用して 2 つの gmon.out ファイル (1 スレッドにつき 1 ファイル) が生成されます。AIX 5.2 またはそれ以前で -pg フラグを指定してアプリケーションをコンパイルし、 それを AIX 5.3 で実行する場合、 スレッド・レベルでのプロファイル作成は使用可能になりません。スレッド・レベルでのプロファイル作成を使用可能にするには、 アプリケーションを -pg フラグ指定で AIX 5.3 以降でコンパイルする必要があります。

gprof コマンドは、次の 3 つの項目を生成します。

  1. 第 1 に、prof コマンドによって提供されるものと同様の、フラット・プロファイルが生成されます。このリストには、プログラム内の各関数の合計実行時間とコール・カウントが、降順にソートされて表示されます。次に、時間がコール・グラフの縁に沿って伝搬されます。 サイクルが見つかると、サイクルの時間を共用するためにサイクルへの呼び出しが行われます。
  2. 第 2 のリストには、コール・グラフの子孫の時間も含めて、表す時間に従ってソートされた関数が示されます。各関数項目の下には、その (直接の) コール・グラフの子と、時間がこの関数にどのように伝搬されるかが示されます。 関数の上の同様の表示には、関数の時間とその下位の時間がどのように (直接の) コール・グラフの親に伝搬されるかが示されます。
  3. サイクルも表示されます。サイクルについては、 サイクル全体に関するエントリー、サイクルのメンバーのリスト、時間への影響、 サイクルのコール・カウントに関するリストが表示されます。
注: gprof コマンドへの入力にスレッド・レベルのプロファイル作成データ (gmon.out ファイルのフォーマットによる) が含まれる場合は、gprof コマンドによって上記の 3 つの項目がスレッドごとに作成されます。最初が累積報告、次にスレッドごとの報告 (スレッド ID の昇順にソートされている) が続きます。

grpof コマンドを使用して、リモート・マシン上のプログラムの実行 プロファイルを分析することもできます。 その分析を行うには、コール・グラフ・プロファイル・ファイル (デフォルトで は gmon.out) 上で -c オプショ ン指定の gprof コマンドを実行して、後でリモート・ マシン上で処理できるファイル (デフォルトでは gprof.remote) を 生成します。gmon.out 以外のコール・グラフ・プロファイル・ファイルを 使用する場合は、コール・グラフ・プロファイル・ファイル名を、-c Filename および実行可能ファイル名の後に指定する必要があります。GPROF 環境変数の file属性が multi に設定されている場合は、Filename を指定する必要があります。これにより、複数の gmon.out ファイルが作成されます。この場合、実行プログラムの fork 時に PID ごとに 1 つずつ gmon.out ファイルが作成されます。リモート・マシン上で -x オプションを使用して、プロファイル 報告書を生成するための gprof.remote (デフォルトの場合) ファイルを 処理できます。

fork および exec サブルーチンを使ったプロファイル処理

プログラムが複数の並行処理に対して、 fork、 または exec サブルーチンを実行する場合は、 gprof コマンドを使ったプロファイル処理が問題となります。プロファイル処理は、各プロセスの環境の属性なので、 新しいプロセスを fork するプロセスのプロファイル処理をすると、その子のプロファイルも処理されます。 ただし、両方のプロセスによって、親プロセスを実行するディレクトリーに gmon.out ファイルが書き込まれるので、一方が上書きされます。 複数のプロセスのプロファイル処理をするときには、tprof コマンドの使用をお勧めします。file:multi を使用して、親プロセスの gmon.out ファイルが削除されるのを防ぐことができます。file:multi は AIX の命名規則を使用して gmon.out ファイルを生成するので、子プロセスの gmon.out ファイルは親と同じ名前を持ちません。したがって、上書きが避けられます。

ソース・コードなしのプロファイル処理

プログラムのソースがない場合は、再コンパイルせずに gprof コマンドを使ってプロファイル処理します。しかし、プログラム・モジュールを適切なコンパイラー・コマンド (例えば、C の場合は cc) に再リンクできなければなりません。再コンパイルしないと、コール・カウントを取得できませんが、コール・カウントがなくてもフラット・プロファイルは役に立ちます。 追加の利点として、プログラムの実行速度は通常とほとんど変わりません。 次の例では、プロファイルの方法について説明します。

cc -c dhry.c         # Create dhry.o without call counting code.
cc -pg dhry.o -L/lib -L/usr/lib -o dhryfast
                     # Re-link (and avoid -pg libraries).
dhryfast             # Create gmon.out without call counts.
gprof >dhryfast.out  # You get an error message about no call counts
                     #  -- ignore it.

コール・カウントなしで実行した結果は、ある種の高速に実行された関数が (呼び出されたのに) リストには現れないということを示しています。しかし、これが gprof コマンドの通常の結果です。gprof コマンドは、 最低でも 1 回呼び出された関数、または最低でも 1 クロック・ティック間登録された関数だけを表示します。 ところが、高速に実行された関数は、実際に実行されても、ほとんどの場合クロック・ティックをまったく受け取っていません。コール・カウントは中断されているので、このような小さな関数はリストには現れません。 (ランタイム・ルーチンのコール・カウントを取得するには、cc -pg コマンド・ラインで -L オプションを省略します)。

使用する実メモリーの量を少なくする

gprof コマンドを使用してプロファイルを作成すると、プログラムによって過度のページングが行われる可能性があります。これは、-pg オプションにより、プログラム・テキストのサイズの半分に相当する固定された実メモリー・バッファー・スペースが専用化されるためです。ページングが過度に行われても、プロファイル作成によって生成されるデータに影響はありません。これは、プロファイル作成されるプログラムでは、プロセッサーを使用するときだけティックが生成され、入出力の待ち状態のときにティックが生成されないためです。過度のページングによる時間遅延を受け入れることができない場合は、tprof コマンドの使用をお勧めします。

フラグ

項目 説明
-b プロファイル内の各フィールドの記述が出力されるのを抑止します。
-c Filename プロファイル作成情報のリモート処理に必要な情報を含むファイルを作成します。-c フラグを他のフラグと組み合わせて使用してはなりません。
-E Name -e フラグと同様に、ルーチン Name とその子孫ルーチンに関するグラフ・プロファイル・エントリーの出力を抑止しますが、時間の合計とパーセントの計算から、ルーチン Name とその子孫ルーチンによって費やされた時間を除外します。(デフォルトは、-E MonitorCount -E MonitorCleanup です。)
-e Name ルーチン Name とそのすべての子孫ルーチンに関するグラフ・プロファイル・エントリーの出力を (ほかの祖先が抑止されていない場合のみ) 抑止します。-e フラグは複数指定できます。ルーチンは、-e フラグごとに 1 つしか指定できません。
-F Name -f フラグと同様に、ルーチン Name とその子孫ルーチンについてのみグラフ・プロファイル・エントリーを出力しますが、合計時間とパーセントの計算には出力されたルーチンの時間だけを使います。 -F フラグは複数指定できます。ルーチンは、-F フラグごとに 1 つしか指定できません。-F フラグを指定すると、-E フラグは指定変更します。
-fName 指定したルーチン Name とその子孫ルーチンについてのみグラフ・プロファイル・エントリーを出力します。 -f フラグは複数指定できます。 ルーチンは、-f フラグごとに 1 つしか指定できません。
-g Filename コール・グラフ情報を指定の出力 filename に書き込みます。 -p フラグを使用していない場合は、 これによってプロファイル情報も抑止されます。
-i Ffilename ルーチン・インデックス・テーブルを指定の出力 filename に書き込みます。 このフラグを使用しない場合は、インデックス・テーブルは、 標準出力の終わり、または -p-g のフラグで指定されたファイル名の最後のいずれかに書き込まれます。
-L PathName 共用オブジェクトの位置を決定するときに使用する代替パス名を使用します。
-p Filename 指定された出力ファイル名にフラット・プロファイル情報を書き込みます。-g フラグが使用されていなければ、 これによってコール・グラフ情報も抑止されます。
-s 指定したすべてのプロファイル・ファイル内のすべてのプロファイル情報がまとめられたプロファイル・ファイル gmon.sum を生成します。 この要約プロファイル・ファイルを指定して gprof コマンドを (-s フラグを使用して) 実行すると、a.out ファイルの複数の実行にわたってプロファイル・データを累積できます。
-x Filename プロファイル報告書を生成するために Filename (-c オプションを 使用して作成されたファイル) から情報を取り出します。Filename を指定しない場合は、 gprof コマンドはデフォルトの gprof.remote ファイルを検索します。
-z 使用量がゼロのルーチンを表示します (コール・カウントと累積時間で示されます)。

  1. プロファイル作成済みの出力を取得するには、次のコマンドを入力します。
    
    gprof
  2. 以前に実行し、移動された可能性のあるコマンドから、 プロファイル出力を取得するには、次のコマンドを入力します。
    gprof -L/home/score/lib runfile runfile.gmon
    この例では、runfile.gmon ファイルをサンプル・データとして、また runfile ファイルをローカル記号として使用し、ロード可能なオブジェクトを /u/score/lib ファイル内で探します。
  3. サンプル・プログラム dhry.c のプロファイルを作成するには、次のようにします。
    1. 次のように、 アプリケーション・プログラムを cc -pg コマンドで再コンパイルします。
      cc -pg dhry.c -o dhry # Re-compile to produce gprof output.
    2. 再コンパイルしたプログラムを実行します。gmon.out というファイルが現在の作業ディレクトリーに作成されます (プログラム実行可能ファイルが置かれているディレクトリーではありません)。
      
      dhry    # Execute program to generate ./gmon.out file.
    3. gprof コマンドを、gmon.out ファイルが入っているディレクトリーで実行し、コール・グラフ・レポートとフラット・プロファイル・レポートを生成します。
      
      gprof >gprof.out     # Name the report whatever you like
      vi gprof.out         # Read flat profile first.
    4. 細分度がスレッド・レベルのプロファイル作成を生成 し、GPROF 環境変数を以下のようにエクスポートし、アプリケーションを実行するには、 次のコマンドを入力します。
      export GPROF=profile:thread
      dhry   # Execute program to generate ./gmon.out file which has thread level granularity
    5. プロセスごとの gmon.out ファイルを、プレフィックス mygmon で生成するには、次のコマンドを入力します。
      export GPROF=file:multi,filename:mygom
      dhry  # Execute program to generate ./gmon-dhry-2468.out
    6. スレッドごとの gmon.out ファイルを、 倍率 10、tgmon というプレフィックスを付けたファイル名で生成するには、 次のコマンドを入力します。
      export GPROF=profile:thread,file:multithread,scale:10,filename:tgmon
      dhry # Execute program to generate ./tgmon-dhry-2468-Pthread215.out
    7. gmon-dhry-2468.out からフラット・プロファイル・レポート だけを見るためには、次のコマンドを入力します。
      gprof -p fprofile.out ./dhry ./gmon-dhry-2468.out 
    8. gmon-dhry-2468.out からコール・グラフ・プロファイル・レポート だけを見るためには、次のコマンドを入力します。
      gprof -g callgraph.out ./dhry ./gmon-dhry-2468.out
  4. gprof コマンドのリモート処理機能を使用する場合:
    1. 次のように、アプリケーション・プログラムを cc -pg コマンドで再コンパイルします。
      cc -pg thread.c -o thread  -lpthread
    2. 次のように、スレッド・レベルのプロファイル細分度を使用可能にし、gmon.out に別の名前を使用します。
      export GPROF=profile:thread,filename:mygmon
    3. 再コンパイルしたプログラムを実行します。mygmon.out というファイルが現在の作業ディレクトリー (プログラム実行可能ファイルが置かれているディレクトリーではありません) に作成されます。
      thread    # Execute program to generate mygmon.out file.
    4. 次のように -c フラグを使用して、my.remote ファイルを 生成します。このファイルは、リモート・マシンで使用して処理できます。
      gprof -c my.remote thread mygmon.out
    5. リモート・マシンでは、次のように -x フラグを使用 して、my.remote ファイルから情報を抽出します。
      gprof -x my.remote

以上の gprof コマンドの説明では、ほとんどの例で C プログラム dhry.c を使用しています。しかし、C コンパイラーの cc を適切なコンパイラー名に置き換え、関数 という言葉をサブルーチン という言葉に置き換えれば、FORTRAN または COBOL の各モジュールについても同様に実行できます。 例えば、次のコマンドは、 matrix.f という FORTRAN プログラムのプロファイルを、 どのように作成するかを示します。

xlf -pg matrix.f -o matrix # FORTRAN compile of matrix.f program
matrix                    # Execute with gprof profiling,
                          #   generating gmon.out file
gprof > matrix.out        # Generate profile reports in
                          #   matrix.out from gmon.out
vi matrix.out             # Read flat profile first.

ファイル

項目 説明
a.out 名前リストとテキスト・スペース
gmon.out 動的コール・グラフとプロファイル
gmon.sum 要約された動的コール・グラフとプロファイル
gprof.remote リモート・プロファイル作成用のファイル
/usr/ucb/gprof gprof コマンドが入っています。
/usr/ccs/bin/gprof gprof コマンドが入っています。