Provided by: manpages-ja_0.5.0.0.20210215+dfsg-1_all
名前
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' ファイルにセー ブされない。 January 29, 1993 GPROF(1)