5

私はいくつかのcプロジェクトにプロファイラーを構築しようとしています。gccが、コンパイル時にすべての関数エントリと関数出口ポイントにアセンブリ命令を配置するようにします。Webでいくつかのガイドを検索しようとしましたが、成功しませんでした。どこでそれを行う方法を学ぶことができますか?

少し早いですがお礼を。

4

2 に答える 2

6

-finstrument-functionsどうやら、フラグを使用してgccにインストルメンテーション呼び出しを生成させることができます

void __cyg_profile_func_enter(void *func, void *callsite); 
void __cyg_profile_func_exit(void *func, void *callsite); 

関数の開始時と終了時。私はこれを使ったことがありませんが、すばやく検索すると、ここ、ここ、ここ、ここに情報と表示ます

于 2013-02-13T11:05:05.040 に答える
2

変更したい場合を除いてgcc(これは簡単ではありません!)、2つのかなり明白なアプローチがあると思います。

  1. Cコード自体を前処理します。簡単ではありませんが、それほど難しくはありません。関数の最初と最後を見つけてコードを追加し、コンパイラーにコードの作成を適切に行わせます...市場には、何らかの方法でこれを行うツールがかなりあります。さまざまな目的[コードフロー分析、プロファイリングなど]。
  2. gccのアセンブラー出力を取得して処理し、そこで関数にコードを追加します。これは、ある意味では簡単で、ある意味では難しいです。関数の識別はおそらくこれ以上難しいことではありませんが、挿入されたアセンブラコードが完全に「安全」でない限り、アセンブラコードを「壊さない」ことは難しいかもしれません。

明らかに、変更のオプションgccも可能ですが、コンパイラコードはかなり複雑であり、基本的に既存のフックをすべて使用しない限り、gprofそれは学校のプロジェクトではないと思います-博士号またはそのようないくつか。

于 2013-02-13T11:03:55.690 に答える