EN JA
GPROF(1)
GPROF(1) FreeBSD General Commands Manual 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 の実行プロファイルを生成します。呼び出されたルーチンの実行時間は、呼び出した側のルーチンに加算されます。プロファイルデータは、呼び出しグラフプロファイルファイル (call graph profile file) から読み出されます。このファイルは、 cc(1), pc(1), f77(1)-pg をつけてコンパイルされたプログラムによって生成されます。 -pg をつけると、コンパイラは、プロファイル用ライブラリをリンクします。約束事として、これらのライブラリの名前の後には、 _p が付きます。つまり、プロファイルされるバージョンの libc.a は、 libc_p.a であり、コンパイラや隣家に直接ライブラリを指定するときに -l c の代りに -l c_p を使用可能です。与えられたオブジェクトファイル (デフォルトでは、 a.out) を読み込んで、そのオブジェクトのシンボルテーブルと呼び出しグラフプロファイルとを結び付けます。デフォルトのグラフプロファイルファイルの名前は、実行形式名にサフィックス .gmon を付けたものです。 2 つ以上のプロファイルファイルが与えられると、 gprof は、それらの情報を合計して出力します。

gprof ユーティリティは、各ルーチンが消費した時間を計算します。次に、この時間は、呼び出しグラフの辺にそって伝播されます。サイクルが見つかると、サイクルに対する呼び出しが、サイクルの時間を共有するものとされます。最初のリストには、関数からの呼び出しグラフ全体の合計時間によってソートされた関数が表示されています。各関数のエントリの下には、その関数の呼び出しグラフでの (直接の) 子 (すなわち呼び出された関数名) が表示され、それらの関数の消費時間がどれくらい親 (つまり呼び出した側の関数) に伝播されているかが示されています。同様に、各関数のエントリの上側には、関数での消費時間が呼び出し元の関数にどのように伝播されているかが示されています。

サイクル全体とそのメンバのリストを示したエントリが、サイクルの呼び出し回数や実行時間への各メンバの寄与を含めて表示されます。

次のリストでは、 prof(1) (NetBSD, FreeBSD にはありません) と同様なフラットプロファイル (flat profile) 表示されます。このリストは、合計実行時間、呼び出し回数、呼び出しがルーチン自体で消費された時間、と呼び出しが、それらの子孫を含んでルーチン自体で消費された時間を与えます。呼び出し時間の単位は、通常ミリ秒ですが、プロファイルクロック周波数が 1000 万以上であるなら、ナノ秒です、関数が決して呼び出されないように思えるなら、合計自己時間は、呼び出しカラムごとに自己時間の割合として印刷されます。短命なプログラムのための呼び出し回数ごとに十分な精度を得るために必要とされる非常に高いプロファイルクロック周波数は、“high resolution” (高分解能) の (統計もとづかない) カーネルプロファイルだけで実装されます。

最後に関数名の索引が表示されます。

以下のオプションが利用可能です。

-a
静的に宣言された関数の表示を抑制します。このオプションが指定されると、静的関数についてのすべての関連する情報 (実行時間、別の関数の呼び出し、他の関数からの呼び出しなど) が、 a.out ファイル中の静的関数の直前に読み込まれるされる関数に含まれることになります。
-b
プロファイル中の各フィールドの説明文を抑制します。
-C count
count 数以上の関数を含む (呼び出し関係の) サイクルを取り除くために、切断すべきアーク (呼び出し関係) の最小集合を見つけます。注意:サイクルを中断するために用いられるアルゴリズムは、指数関数的なものです。そのため、このオプションを指定すると、 gprof を実行するのに非常に長い時間がかかります。
-e name
ルーチン name とそのすべての子孫 (それらの関数が表示抑制されていない親をほかに持っていなければ) のグラフプロファイルエントリの表示を抑制します。 2 つ以上の -e を指定することができます。各 -e には、1 つしか name を指定することができません。
-E name
-e と同様、指定されたルーチン name のグラフプロファイルエントリ表示を抑制します。さらに、プログラムのトータルの時間と計算時間のパーセンテージから 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 には一対のルーチン名しか指定することができません。
-K
sysctl(3) および kldsym(2) のインタフェースを使用して、現在実行中のカーネルからシンボル情報を収集します。これは、 a.out 引数を無視させ、 kld(4) モジュール中のシンボルを使用できるようにします。
-l
呼び出しグラフプロファイルの表示を抑制します。
-L
フラットプロファイルの表示を抑制します。
-s
指定されたすべてのプロファイルファイル中のプロファイル情報の合計を表すサマリプロファイルファイル gmon.sum が生成されます。このサマリプロファイルファイルは、このあとの gprof の実行に対して与えられ (その際にも通常 -s が指定される)、一連の a.out 実行の結果のプロファイルデータの合計を求めることができます。
-u
C プログラムには、見えない名前の関数の表示を抑制します。 ELF オブジェクト形式では、文字‘ .’を含む名前を意味します。 a.out オブジェクト形式では、文字‘ _’で開始しない名前を意味します。それらの関数に関連する情報は、すぐ低位側のアドレスにある (表示が抑制されていない) 関数に含まれます。これにより関数内にあるただのラベルが関数と認識されてしまうのを防ぐ事ができます。
-z
使用されていないルーチン (呼び出し回数と合計時間が 0 である) を表示します。

関連ファイル

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

関連項目

cc(1), profil(2), clocks(7) S. Graham, P. Kessler, and M. McKusick, An Execution Profiler for Modular Programs, Software - Practice and Experience, 13, pp. 671-685, 1983. S. Graham, P. Kessler, and M. McKusick, gprof: A Call Graph Execution Profiler, Proceedings of the SIGPLAN '82 Symposium on Compiler Construction, SIGPLAN Notices, 6, 17, pp. 120-126, June 1982.

歴史

gprof プロファイラは、 4.2BSD で登場しました。

バグ

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

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

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

December 25, 2008 FreeBSD