GCC で C コードをコンパイルするときに-pg
(または) フラグがどのように機能するかを理解しようとしています。-p
公式GCCドキュメント州のみ:
-pg
分析プログラム gprof に適したプロファイル情報を書き込むための追加コードを生成します。データが必要なソース ファイルをコンパイルするときにこのオプションを使用する必要があります。また、リンクするときにもこのオプションを使用する必要があります。
プロファイラーについて少し調査しているので、これは本当に興味深いです。仕事に最適なツールを選ぼうとしています。
ベストアンサー1
コンパイル-ページコードをインストルメント化してGprof詳細情報を報告します。gprof のマニュアル、9.1 プロファイリングの実装:
プロファイリングは、プログラム内のすべての関数のコンパイル方法を変更して、関数が呼び出されたときに、どこから呼び出されたかに関する情報を保管することで機能します。これにより、プロファイラーはどの関数が関数を呼び出したかを把握し、関数が何回呼び出されたかをカウントできます。この変更は、プログラムが オプション付きでコンパイルされたときにコンパイラによって行われ
-pg
、すべての関数は最初の操作の 1 つとして を呼び出しますmcount
(または_mcount
、__mcount
OS とコンパイラによっては 、または )。プロファイリング ライブラリに含まれるルーチン
mcount
は、その親ルーチン (子) とその親の親の両方をメモリ内呼び出しグラフ テーブルに記録する役割を担っています。これは通常、スタック フレームを調べて子のアドレスと元の親の戻りアドレスの両方を見つけることによって行われます。これはマシンに大きく依存する操作であるため、mcount
通常はそれ自体が短いアセンブリ言語スタブ ルーチンであり、必要な情報を抽出してから、 と の__mcount_internal
2 つの引数で (通常の C 関数)を呼び出します。frompc
は、、、およびこれらの各呼び出しアークが走査された回数を記録するメモリ内呼び出しグラフを維持する役割を担っています。selfpc
__mcount_internal
frompc
selfpc
...
このようなインストルメンテーション プロファイラーを使用すると、プロファイリング インストルメンテーションなしでリリースでコンパイルするのと同じコードをプロファイリングすることに注意してください。インストルメンテーション コード自体に関連するオーバーヘッドがあります。また、インストルメンテーション コードによって、命令とデータ キャッシュの使用法が変更される場合があります。
インストルメンテーションプロファイラーとは対照的に、サンプリングプロファイラーはインテルVTuneオペレーティング システムの割り込みを使用して、対象プログラムのプログラム カウンターを定期的に確認することで、インストルメント化されていないコードに対して動作します。また、特殊な CPU レジスタを照会して、何が起こっているかをさらに詳しく把握することもできます。