36

を使用してCコードをコンパイルするときに-pg(または)フラグがどのように機能するかを理解しようとしています。-pgcc

公式のgccドキュメントには次のように記載されています

-pg
分析プログラムgprofに適したプロファイル情報を書き込むための追加のコードを生成します。このオプションは、データが必要なソースファイルをコンパイルするときに使用する必要があります。また、リンクするときにも使用する必要があります。

私はプロファイラーについて小さな調査を行っているので、これは本当に興味があります-仕事に最適なツールを選択しようとしています。

4

3 に答える 3

30

詳細情報-pgを報告するようにコードをインストルメントでコンパイルします。gprofのマニュアル、9.1プロファイリングの実装を参照してください。gprof

プロファイリングは、プログラム内のすべての関数のコンパイル方法を変更することで機能します。これにより、呼び出されたときに、呼び出し元に関する情報が隠されます。これから、プロファイラーはそれを呼び出した関数を把握し、呼び出された回数を数えることができます。この変更は、プログラムが-pgオプションを使用してコンパイルされたときにコンパイラーによって行われます。これにより、すべての関数が最初の操作の1つとしてmcount(または_mcount__mcountOSとコンパイラーによっては、、または、)呼び出されます。

プロファイリングライブラリに含まれているルーチンは、そのmcount親ルーチン(子)とその親の親の両方をメモリ内のコールグラフテーブルに記録する役割を果たします。これは通常、スタックフレームを調べて、子のアドレスと元の親のリターンアドレスの両方を見つけることによって行われます。これは非常にマシンに依存する操作であるため、通常、それ自体は必要な情報を抽出し、 2つの引数(<code> frompcと。)を使用して(通常のC関数)をmcount呼び出す短いアセンブリ言語のスタブルーチンです。は、メモリ内のコールグラフを維持する責任があります。このグラフには、、、およびこれらの各コールアークがトラバースされた回数が記録されます。__mcount_internalselfpc__mcount_internalfrompcselfpc

..。

このようなインストルメンテーションプロファイラーを使用すると、インストルメンテーションをプロファイリングせずにリリースでコンパイルするのと同じコードをプロファイリングすることに注意してください。インストルメンテーションコード自体に関連するオーバーヘッドがあります。また、インストルメンテーションコードは、命令とデータキャッシュの使用法を変更する場合があります。

インストルメンテーションプロファイラーとは異なり、 Intel VTuneのようなサンプリングプロファイラーは、オペレーティングシステムの割り込みを使用して、ターゲットプログラムのプログラムカウンターを定期的に確認することにより、インストルメントされていないコードで動作します。また、特別なCPUレジスタを照会して、何が起こっているのかをさらに詳しく知ることもできます。

プロファイラーインスツルメンテーションとサンプリングも参照してください。

于 2011-09-03T00:04:37.923 に答える
9

このリンクは、gprofがどのように機能するかについての簡単な説明を提供します。

このリンクはそれについての広範な批評を与えます。(アーカイブされた質問に対する私の答えを確認してください。)

于 2011-09-03T16:13:26.447 に答える
0

このソースから:https ://elinux.org/images/0/0c/Bird-LS-2009-Measuring-function-duration-with-ftrace.pdf :

「インストルメンテーションには、明示的に宣言されたトレースポイントと暗黙的なトレースポイントの2つの主要な形式があります。明示的なトレースポイントは、トレースポイントの場所を指定する開発者定義の宣言と、特定のトレースサイトで収集する必要があるデータに関する追加情報で構成されます。暗黙的なトレースポイントが配置されます。コンパイラフラグまたは開発者が一般的に使用するマクロを再定義することにより、コンパイラによって自動的にコードに組み込まれます。

関数を暗黙的にインストルメント化するために、カーネルが関数トレースをサポートするように構成されている場合、カーネルビルドシステムはコンパイラで使用されるフラグに-pgを追加します。これにより、コンパイラは各関数のプロローグにコードを追加し、mcountと呼ばれる特別なアセンブリルーチンを呼び出します。このコンパイラオプションは、プロファイリングとトレースの目的で使用することを特に目的としています。「」

于 2017-09-15T01:24:24.357 に答える