2

いくつかの目的のためにgccをインストルメントする必要があります。目標は、特にコンパイル中に呼び出されるGCC関数を追跡できるようにすることです。残念ながら、私はGCCのアーキテクチャにあまり詳しくないので、少し助けが必要です。次の手順を試しました。

1)gcc / Makefile.inをハッキングし、「-finstrument-functions」フラグをT_CFLAGSに追加します。2) start_test関数とend_test
関数 の実装とテスト済みのバージョンがあります。これらは、toplev_main()呼び出しの前後に、gcc/main.cから呼び出されます。含まれているファイルはgccにリンクされています(オブジェクトはOBJS-commonに追加され、依存関係は後でgcc / Makefile.inで定義されます) 3)contrib/download_prerequisitesを使用して前提条件をダウンロードします。 4)クリーンなビルドディレクトリ(ソースディレクトリと同じレベル)から構成を実行します 。5)「makeall」でビルドを開始します。

./../gcc-4.6.2/configure --prefix="/opt/gcc-4.6.2/" --enable-languages="c,c++"

このようにして、28Gを使用していましたが、メモリが不足しました。
次に、MakefileからT_CFLAGS設定を削除し、makeコマンドに-finstrument-functionsを指定しようとしましたmake CFLAGS="-finstrument-functions"。ビルドはこの方法で成功しましたが、何かをコンパイルしようとすると、空の出力ファイルが生成されました。(理論的には、 end_testはその結果を特定のファイルに書き込む必要があります。)

何を間違えますか?前もって感謝します!

4

1 に答える 1

2

インストルメンテーションから特に除外しない限り、それ自体がインストルメンテーションの対象となるため、自分と内部mainに電話をかけることは、あなたが望む方法ではありません。ファイルが適切なタイミングで開閉されるようにする「正しい」方法は、「コンストラクタ」と「デストラクタ」を定義することであり、GCCは次の前後にそれらへの呼び出しを自動的に生成します。start_testend_test mainmain

void start_test (void)
  __attribute__ ( (no_instrument_function, constructor));

void end_test (void)
  __attribute__ ( (no_instrument_function, destructor));

/* FILE to write profiling information.  */
static FILE *profiler_out;

void start_test (void)
{
  profiler_out = fopen ("profiler.out", "w");
  if (profiler_out == NULL)
    exit (-1);
}

void end_test (void)
{
  fclose (profiler_out);
}

脚注:

  1. constructordestructorおよびno_instrument_function属性について詳しくは、こちらをご覧ください。これらは、GCCが理解する関数属性です。
  2. IBMのWebサイトで、この優れたインストルメンテーションガイドをお読みください。
于 2012-06-05T17:52:17.130 に答える