GPROF(1)

名称
gprof - プロファイルデータの呼び出しグラフを表示する

書式
gprof [options] [a.out [gmon.out ...]]

解説
gprof は、C や Pascal, Fortran77 の実行プロファイルを生成します。 gprof では、呼び出されたルーチンの実行時間は、呼び出した側の ルーチンにプロファイルとして加算されます。 プロファイルデータは、呼び出しグラフプロファイル (デフォルトは gmon.out) から得られます。このファイルは、 cc(1), pc(1), f77(1) で -pg をつけてコンパイルされたプログラムによって生成されます。 -pg をつけると、コンパイラはプロファイル用にコンパイルされたライブラリと リンクを行います。 gprof は与えられたオブジェクトファイル (デフォルトでは a.out) を読み込んで、そのオブジェクトのシンボルテーブルと gmon.out から得られる呼び出しグラフプロファイルとを結び付けます。1 つ以上の プロファイルファイルが与えられると、 gprof は、それらのプロファイルファイルの情報を合計したものを出力します。

gprof は、各ルーチンが消費した時間の合計を計算します。 あるルーチンが消費した時間は、呼び出しグラフの関係にそって 呼び出したルーチンの消費した時間に含まれることになります。 サイクルが見つかると、サイクルに対する呼び出しが、サイクルの時間を 共有するものとされます。

最初のリストには、関数からの呼び出しグラフ全体の合計時間によって ソートされた関数が表示されています。 各関数のエントリの下には、その関数の呼び出しグラフでの (直接の) 子供である 呼び出した関数名が表示され、それらの関数の消費時間がどれくらい親である 関数に伝播されているかが示されています。 同様に、現在の関数の消費時間と、現在の関数を呼び出している親である 関数に加算された消費時間が示されます。 全体のサイクルといっしょに、サイクルのメンバーのリストやそれらが 影響を与えるサイクルを呼び出す回数や時間が表示されます。

次のリストでは、 prof(1) (NetBSD にはありません) と同様なフラットなプロファイルが表示されます。 これは、関数のトータルの実行時間や呼び出し回数、ルーチン自身が 呼び出しに使ったミリ秒単位の時間、そのルーチンがさらに呼び出した関数も 含めて呼び出しに使ったミリ秒単位の時間を表示します。

最後に、関数の名前のインデックスが表示されます。

オプション:

-a  静的に宣言された関数の表示を抑制します。 このオプションが指定されると、静的関数についてのすべての関連する情報 (すなわち、サンプリングの時間や、別の関数の呼び出し、 他の関数から呼ばれたかどうか) が、 a.out ファイル 中の静的関数以前にロードされる関数に含まれることになります。

-b  プロファイル中の各フィールドの説明文を抑制します。

-c  プログラムの静的呼び出しグラフを、オブジェクトファイルのテキスト空間 を調べる方法を使って見つけます。静的な呼び出しのみの親と子供は、 呼び出し数 0 として表示されます。

-C count
    count 数以上の関数を含むサイクルをすべて削除することによって、 サイクルになっていない呼び出し関係の最小集合を発見するアルゴリズムを用います。 注意: サイクルを中断するために用いられるアルゴリズムは実験的な ものです。そのため、このオプションを指定すると、 gprof を実行するのに非常に長い時間がかかります。

-e name
    ルーチン name とそのすべての子孫 (それらの関数がほかに親を持っていなければ) の グラフプロファイルエントリの表示を抑制します。1 つ以上の -e を指定することができます。各 -e には 1 つしか name を指定することができません。

-E name
    -e と同様、指定されたルーチン name のグラフプロファイルエントリ表示を抑制します。 さらに、プログラムのトータルの時間と計算時間のパーセンテージから name で使われている時間を取り除きます。 -E オプションは、複数指定することができます。各オプション -E には、1 つしか name を指定することができません。 (たとえば、 -E mcount -E mcleanup がデフォルトです)

-f name
    指定されたルーチン name とその子孫のグラフプロファイルエントリを表示します。 -f オプションは、複数指定することができます。 各オプション -f には、1 つしか name を指定することができません。

-F name
    -f と同様に、指定されたルーチン name とその子孫のグラフプロファイルエントリを表示します。 プログラムのトータルの時間と計算時間の割合には、 表示されたルーチンの時間のみが使われます。 オプション -F は複数指定することができます。各オプション -F には、1 つしか name を指定することができません。オプション -F は、オプション -E の効果を打ち消します。

-k fromname toname
    ルーチン fromname から toname の間の呼び出し関係を削除します。 このオプションによって、不必要だと思うサイクルを取り除くことができます。 オプション -k は、複数指定することができます。各オプション -k には一対のルーチン名 (fromname と toname) しか指定することができません。

-s

    指定されたすべてのプロファイルファイル中のプロファイル情報の合計を表す サマリプロファイルファイル gmon.sum が生成されます。 このサマリプロファイルファイルは、あとの gprof の実行に対して与えられ (-s が指定されている場合)、 a.out を何回か実行した結果のプロファイルデータを合計したものとなります。

-z  (呼び出し回数と合計時間によって示されるものが 0 である) 使用されない ルーチン (zero usage) を表示します。 -c オプションとともに使うことによって、決して呼ばれることがないルーチン を発見する場合に便利です。

関連ファイル
a.out
    テキスト空間の名前リスト
gmon.out
    動的な呼び出しグラフとプロファイル
gmon.sum
    動的な呼び出しグラフとプロファイルのサマリ

関連項目
monitor(3), profil(2), cc(1), prof(1)

An Execution Profiler for Modular Programs, S. Graham, P. Kessler, M. McKusick, Software - Practice and Experience, 13, pp. 671-685, 1983.

gprof: A Call Graph Execution Profiler, S. Graham, P. Kessler, M. McKusick, Proceedings of the SIGPLAN '82 Symposium on Compiler Construction, SIGPLAN Notices, 17, 6, pp. 120-126, June 1982.

バグ
あるサンプリングの周期がリストの最初に表示されますが、もっとよい統計方法 があるかもしれません。我々は、各関数の実行時間はその関数が消費した時間 の合計をその関数の呼び出し回数で割ったものによって表現されると 仮定しています。 したがって、呼び出しグラフの関係にそって関数の親に伝播される時間は、 その関係をたどる回数に直接比例しています。

自身がプロファイルされていない親は、プロファイルしている子供から 伝播される時間を持っており、呼び出しグラフのリストのなかで 自動的に起動されるものとして現れます。しかし、この関数が持つ時間は それ以上伝播されません。 同様に、シグナルを捕捉する関数は、それらがプロファイルされている かぎり、自動的に現れます (理由は明らかではありませんが)。 シグナルを捕捉する関数の子供は、伝播される時間を正しく持つべきですが、 プロファイルルーチンを実行している間にシグナルを捕捉する関数が 実行された場合は、すべて失われてしまいます。

プロファイルされているプログラムは、 exit(2) を呼ぶか、 gmon.out ファイルにプロファイル情報がセーブされるよう 正常に終了 (return) しなければいけません。