GPROF(1) FreeBSD 一般コマンドマニュアル GPROF(1)
名称
gprof − 呼び出しグラフに基づくプロファイルデータを表示する |
書式
gprof [−abKlLsuz] [−C count] [−e name] [−E name] [−f name] [−F name] [−k fromname toname] [a.out [a.out.gmon ...]] |
解説 |
gprof ユーティリティは、C や Pascal、Fortran77 の実行プロファイルを生成し ます。 gprof では、呼び出されたルーチンの実行時間は、呼び出した側のルーチ ンに加算されます。プロファイルデータは、呼び出しグラフプロファイルファイ ル (call graph profile file) から読み出されます。このファイルは、 cc(1), pc(1), f77(1) に −pg をつけてコンパイルされたプログラムによって生成されま す。 −pg をつけると、コンパイラはプロファイル用ライブラリをリンクします。 約束事として、これらのライブラリの名前の後には _p が付きます。つまり、プ ロファイルされるバージョンの libc.a は libc_p.a であり、コンパイラや隣家 に直接ライブラリを指定するときに −lc の代りに −lc_p を使用可能です。与え られたオブジェクトファイル (デフォルトでは a.out) を読み込んで、そのオブ ジェクトのシンボルテーブルと呼び出しグラフプロファイルとを結び付けます。 デフォルトのグラフプロファイルファイルの名前は、実行形式名にサフィックス .gmon を付けたものです。 2 つ以上のプロファイルファイルが与えられると、 gprof は、それらの情報を合計して出力します。 gprof ユーティリティは、各ルーチンが消費した時間を計算します。次に、この 時間は呼び出しグラフの辺にそって伝播されます。サイクルが見つかると、サイ クルに対する呼び出しが、サイクルの時間を共有するものとされます。最初のリ ストには、関数からの呼び出しグラフ全体の合計時間によってソートされた関数 が表示されています。各関数のエントリの下には、その関数の呼び出しグラフで の (直接の) 子 (すなわち呼び出された関数名) が表示され、それらの関数の消 費時間がどれくらい親 (つまり呼び出した側の関数) に伝播されているかが示さ れています。同様に、各関数のエントリの上側には、関数での消費時間が呼び出 し元の関数にどのように伝播されているかが示されています。 サイクル全体とそのメンバのリストを示したエントリが、サイクルの呼び出し回 数や実行時間への各メンバの寄与を含めて表示されます。 次のリストでは、 prof(1) (NetBSD, FreeBSDにはありません) と同様なフラット プロファイル (flat profile) 表示されます。ここには、関数の合計実行時間や 呼び出し回数、その関数本体のみの実行時間 (ミリ秒またはマイクロ秒)、その関 数本体及びそこから呼び出された関数の実行時間 (ミリ秒またはマイクロ秒)、が 表示されます。 最後に関数名の索引が表示されます。 以下のオプションが利用可能です。 |
−a
静的に宣言された関数の表示を抑制します。このオプションが指定され ると、静的関数についてのすべての関連する情報 (実行時間、別の関数 の呼び出し、他の関数からの呼び出しなど) が、 a.out ファイル中の静 的関数の直前に読み込まれるされる関数に含まれることになります。 −b −C count −e name −E name −f name −F name −k fromname toname −K −l −L −s −u −z 関連ファイル |
a.out
テキスト空間と名前リスト。 関連項目 |
S. Graham, P. Kessler, and M. McKusick, " An Execution Profilerfor Modular Programs", Software - Practice and Experience, 13, pp.671-685, 1983. S. Graham, P. Kessler, and M. McKusick, " gprof: A Call GraphExecution Profiler", Proceedings of the SIGPLAN ’82 Symposium onCompiler Construction, SIGPLAN Notices, 6, 17, pp. 120-126, June1982.
歴史
gprof プロファイラは、 4.2BSD から登場しました。 |
バグ
サンプリングの周期がリストの最初に表示されますが、統計的な域を出ないもの であるかもしれません。我々は、各関数の実行時間はその関数が消費した時間の 合計をその関数の呼び出し回数で割ったものによって表現されると仮定していま す。したがって、呼び出しグラフの関係にそって関数の親に伝播される時間は、 その関係をたどる回数に直接比例しています。 自身がプロファイルされていない親は、プロファイルしている子供から伝播され る時間を持っており、呼び出しグラフのリストのなかで自動的に起動されるもの として現れます。しかし、この関数が持つ時間はそれ以上伝播されません。同様 に、シグナルを捕捉する関数は、それらがプロファイルされていても、自動的に 起動されるものとして現れます (もう少し複雑な理由がありますが)。プロファイ ルルーチンを実行している最中にシグナルを捕捉する関数が呼出されたとき (こ の場合はすべてが失われてしまいます) を除いては、シグナルを捕捉する関数の 子供の実行時間は、その親に正しく伝播されるべきです。 プロファイルされているプログラムは、グラフプロファイルファイルにプロファ イル情報がセーブされるよう exit(3) を呼ぶか、正常に終了しなければいけませ ん。 FreeBSD 10.0 June 20, 2004 FreeBSD 10.0 |