詳細情報-pg
を報告するようにコードをインストルメントでコンパイルします。gprofのマニュアル、9.1プロファイリングの実装を参照してください。gprof
プロファイリングは、プログラム内のすべての関数のコンパイル方法を変更することで機能します。これにより、呼び出されたときに、呼び出し元に関する情報が隠されます。これから、プロファイラーはそれを呼び出した関数を把握し、呼び出された回数を数えることができます。この変更は、プログラムが-pg
オプションを使用してコンパイルされたときにコンパイラーによって行われます。これにより、すべての関数が最初の操作の1つとしてmcount
(または_mcount
、__mcount
OSとコンパイラーによっては、、または、)呼び出されます。
プロファイリングライブラリに含まれているルーチンは、そのmcount
親ルーチン(子)とその親の親の両方をメモリ内のコールグラフテーブルに記録する役割を果たします。これは通常、スタックフレームを調べて、子のアドレスと元の親のリターンアドレスの両方を見つけることによって行われます。これは非常にマシンに依存する操作であるため、通常、それ自体は必要な情報を抽出し、 2つの引数(<code> frompcと。)を使用して(通常のC関数)をmcount
呼び出す短いアセンブリ言語のスタブルーチンです。は、メモリ内のコールグラフを維持する責任があります。このグラフには、、、およびこれらの各コールアークがトラバースされた回数が記録されます。__mcount_internal
selfpc
__mcount_internal
frompc
selfpc
..。
このようなインストルメンテーションプロファイラーを使用すると、インストルメンテーションをプロファイリングせずにリリースでコンパイルするのと同じコードをプロファイリングすることに注意してください。インストルメンテーションコード自体に関連するオーバーヘッドがあります。また、インストルメンテーションコードは、命令とデータキャッシュの使用法を変更する場合があります。
インストルメンテーションプロファイラーとは異なり、 Intel VTuneのようなサンプリングプロファイラーは、オペレーティングシステムの割り込みを使用して、ターゲットプログラムのプログラムカウンターを定期的に確認することにより、インストルメントされていないコードで動作します。また、特別なCPUレジスタを照会して、何が起こっているのかをさらに詳しく知ることもできます。
プロファイラーインスツルメンテーションとサンプリングも参照してください。