スポンサーリンク

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.alibc_p.a であり、コンパイラや隣家 に直接ライブラリを指定するときに −lc の代りに −lc_p を使用可能です。与え られたオブジェクトファイル (デフォルトでは a.out) を読み込んで、そのオブ ジェクトのシンボルテーブルと呼び出しグラフプロファイルとを結び付けます。 デフォルトのグラフプロファイルファイルの名前は、実行形式名にサフィックス .gmon を付けたものです。 2 つ以上のプロファイルファイルが与えられると、 gprof は、それらの情報を合計して出力します。

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

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

次のリストでは、 prof(1) (NetBSD, FreeBSDにはありません) と同様なフラット プロファイル (flat profile) 表示されます。ここには、関数の合計実行時間や 呼び出し回数、その関数本体のみの実行時間 (ミリ秒またはマイクロ秒)、その関 数本体及びそこから呼び出された関数の実行時間 (ミリ秒またはマイクロ秒)、が 表示されます。

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

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

       −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 には一対のルーチン名 (fromnametoname) しか指定することがで きません。

−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 である) を表 示します。 −c オプションとともに使うと、一度も呼ばれていないルー チンを発見する事ができます。

関連ファイル

       a.out

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

関連項目

cc(1), profil(2), clocks(7)

       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

スポンサーリンク