GPROF(1) | General Commands Manual | GPROF(1) |
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.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' ファイルにセー ブされない。
January 29, 1993 |