gprof

コール・グラフ (call graph) のプロファイルを表示する

gprof - コール・グラフ (call graph) のプロファイルを表示する
gprof [ -abcsz ] [ -e|-E name ] [ -f|-F name ] [ -k fromname toname ] [ objfile [ gmon.out ] ]
gprof は C, Pascal, Fortran77 プログラムの実行プロファイルを生成する。呼び出 されたルーチンの値は呼び出し元に取り込まれる。プロファイルのためのデー タはコール・グラフ (call graph: 関数コールの親子関係のグラフ) のプロファ イルデータファイル (デフォルトでは `gmon.out') から取り 込まれる。このファイルは cc ( 1 ) 、 pc ( 1 ) 、 f77 ( 1 )-pg オプションを指定してコンパイルされたプログラムによって作成される。 -pg オプションでは、リンクされるライブラリもプロファイル用にコンパイルされ たものになる。 gprof は指定されたオブジェクトファイル (デフォルトは `a.out') からシンボ ルテーブルを読み、これと `gmon.out' のコール・グラフ・プロファイルとを 関連付ける。 複数のプロファイルデータファイルが指定された場合には、 gprof はそれらのプロファイル情報をすべて合計して表示する。 gprof はそれぞれのルーチンによって消費された時間を計算する。次にこれらの時間 をコール・グラフの枝に沿って親ルーチンへと伝播させる。プログラムの サイクル (cycle: 再帰呼び出しの循環) をまとめ、サイクルへのコールを行っ たルーチンは、サイクルで消費した時間を共有するとみなす。最初のリストは 関数で、消費時間の順にソートされている。 消費時間にはコール・グラフでの子孫の分も含まれる。それぞれの関数エントリ の下には、その関数のコール・グラフでの (直接の) 子と、そこで消費された 時間がどのように関数に伝播したかが表示される。同様の表示は関数の上にも 表示されており、その関数とそれらの子孫で消費された時間がどのようにコー ル・グラフの (直接の) 親へ伝播するかが示される。 サイクルも表示される。サイクル全体としてのエントリ、そのサイクルに属す るメンバーのリストとそれぞれのメンバーによって消費された時間、その サイクルの呼び出し回数などが表示される。 次にフラットプロファイル ( prof (1) の結果と似たもの) が与えられる。このリストでは合計実行時間、呼び出し回 数、そのルーチン自身で消費した時間 (ミリ秒単位)、子孫の分も含めて消費 した時間 (ミリ秒単位) が表示される。 最後に関数名の索引が与えられる。
以下のオプションが指定できる:
-a
スタティックに宣言された関数を表示しない。このオプションが指定され ると、スタティックな関数に関する全ての情報 (実行時間、他の関数の呼び出 し、他の関数から呼び出される関係など) は、ファイル `objfile' 中でこの スタティックな関数の直前にロードされた関数に属することになる。
-b
プロファイルのそれぞれのフィールドに関する説明を表示しない。
-c
プログラムのスタティックなコール・グラフを、オブジェクトファイルのテキ ストセグメントを調べるという発見的 (heuristic) な手法で作成する。ス タティック・コールだけの親や子の呼び出し回数は 0 として表示する。
-e name
ルーチン name と、その子孫すべてに関するグラフプロファイルのエントリを表示しない (子孫に関しては、別の祖先がいれば表示される)。 -e オプションは複数回指定できる。一つの -e オプションについて指定できる name は一つだけである。
-E name
-e と同様にルーチン name とその子孫に関するグラフプロファイルのエントリを表示しない。また name (とその子孫) によって消費された時間も、プログラム実行の総時間 (および パーセンテージの計算) から除かれる。例えば -E mcount -E mcleanup はデフォルトになっている。
-f name
ルーチン name とその子孫に関してのみ、グラフプロファイルのエントリを表示する。 -f オプションは複数回指定できる。一つの -f オプションについて指定できる name は一つだけである。
-F name
-f と同様に、ルーチン name とその子孫に関してのみ、グラフプロファイルのエントリを表示する。またこ れらによって用いられた時間だけを合計の実行時間とパーセンテージの計算に 用いる。 -F オプションは複数指定できる。一つの -F オプションについて指定できる name は一つだけである。 -F オプションは -E オプションによる設定を上書きする。
-k fromname toname
ルーチン fromname からルーチン toname までの枝を削除する。これは不要なサイクルの循環を破壊するのに便利である。 -k は複数指定できる。一つの -k オプションに対して指定できるのは一組のルーチン名だけである。
-s
プロファイルファイル `gmon.sum' を作成し、指定したプロファイルファイル の情報すべてからのプロファイル情報を総計したものを書き込む。この合計プ ロファイルファイルは後に gprof を (おそらくは -s と共に) 実行する際に与えて、 `objfile' ファイルを複数回実行して得られ たプロファイルデータを累積するために用いることもできる。
-v
gprof のバージョン番号を表示して終了する。
-z
用いられなかった関数 (呼び出し回数と実行時間でわかる) も表示する。これ を -c オプションと共に用いると、呼び出されなかったルーチンを見つけるのに役 に立つ。
a.out 名前のリストとテキスト空間 gmon.out ダイナミックなコール・グラフとプロファイル gmon.sum ダイナミックなコール・グラフとプロファイルのまとめ
monitor ( 3 ) , profil ( 2 ) , cc ( 1 ) , prof ( 1 )
``An Execution Profiler for Modular Programs'', by S. Graham, P. Kessler, M. McKusick; Software - Practice and Experience, Vol. 13, pp. 671-685, 1983.
``gprof: A Call Graph Execution Profiler'', by S. Graham, P. Kessler, M. McKusick; Proceedings of the SIGPLAN '82 Symposium on Compiler Construction, SIGPLAN Notices, Vol. 17, No 6, pp. 120-126, June 1982.
gprof は 4.2 BSD から登場した。
サンプリングの粒度 (granularity) も表示されるが、せいぜい統計的なもの でしかない。ここでは関数の一回あたりの実行時間は、関数の消費した合計時 間を呼び出し回数で割ったものと仮定している。したがって、呼び出しグラフの 枝を伝播して関数の親に伝わる時間は、枝を通過した回数に直に比例すること になる。 自分自身がプロファイルされていない親でも、子から伝播してくる時間を保有 することになる。しかしこれらのルーチンは、呼び出しグラフの中で (どこか ら呼び出されたのでもなく) 勝手に起動するように見えるので、その時間はそ れ以上どこへも伝播しない。同様に、シグナルをキャッチしたルーチンは、プ ロファイルされていても勝手に起動するように見えてしまう (理由はもう少し 複雑だが)。シグナルをキャッチしたルーチンの子がプロファイルされてい ればその時間を正しく伝播させることができるが、親ルーチンがプロファ イルルーチンの途中でシグナルがキャッチされた場合には全ての情報は失われる。 プロファイルされるプログラムは exit ( 2 ) をコールして終了するか、 main ルーチンからの return で終了しなければな らない。さもないと終了時にプロファイル情報が `gmon.out' ファイルにセー ブされない。