2009-09-24 4 views
6

現在、WindowsでVS2005をコーディングしています(ただし、他のコンパイラやプラットフォームのオプションがあるかどうかは気にしません)。私はC(no C++)プログラムを持っていて、次...の関数を考えるカスタム関数のエントリと終了コードを挿入するコンパイラ機能はありますか?

、と言う...

int MyFunction(int myparam) 
{ 
    // Entry point. 
    ... 
    // Exit point. 
    return 1; 
} 

をしたいdは私がエントリポイントで、終了点でのコードのスニペットを入れたいと思います。しかし、すでにそこにある関数の100を変更する必要はありません。コンパイラが関数をすべて変更せずにすべての関数に対して注入する関数のエントリと終了コードを定義する方法はありますか?

私が見つけたまたは試したほとんどのソリューションは、私が多くの仕事であるすべての単一の機能を編集する必要があります。私は他の誰かがこのような何かを打つ必要があり、それを解決しなければならないことを想像します。私は疑わしいこの要求で私は一意にすることはできません。

+1

で他のマニュアルの中で利用可能なC/C++ユーザーガイドに記載されています悪いアイデア。 – Brian

+0

Seconded - オフチャンスの人は誰でもまだ – quixver

答えて

8

これはマイクロソフト固有のものですが、関数を入力して終了するときに何かを行うために_penter_pexit関数にフックすることができます - いくつかの特別なフラグでプロジェクトをコンパイルする必要があります。

ここにはa little bit of a tutorial hereがあり、Googleでそれらを使用する方法についてさらにいくつかの結果があります。また、this blog postは、アセンブリの入口と出口で混乱を避けるために行う必要があるいくつかの詳細に入ります。

+0

とコードしていますが、これはC++のためだけです。 – LB40

+0

私はそうは思わない - 上にリンクされた '_penter' MSDNページは、C言語で書かれた' #include 'の例を示しています。 –

1

あなたはaspect oriented programmingまたはAOPと呼ばれるものを探しています。

これは、C(またはC++)でネイティブにサポートされているものではありません。いくつかのライブラリベースの実装がCのリンクページにリストされています(ただし、これらはどれくらい成熟しているかわかりません)

+1

影響を受けるすべての機能にアスペクト・コードを挿入するには、フロントエンドのコンパイラ/プリプロセッサが必要なことがあります。 –

+0

@ LoadMaster、おそらく。しかし、それはとても悪いことでしょうか? – Glen

5

GCCには-finstrument-functionsフラグがあり、最初と各関数呼び出しの終わりに:

void __cyg_profile_func_enter(void *this_fn, void *call_site); 
void __cyg_profile_func_exit(void *this_fn, void *call_site); 
+1

同様に、 '-pg'はすべての関数のエントリで' mcount'を呼び出しますが、対応する出口フックは提供されません。 – ephemient

0

OpenWatcom CおよびC++コンパイラはそのための-eeと-epのパラメータがあります。

-ee   call epilogue hook routine 
-ep[=<num>] call prologue hook routine with <num> stack bytes available 

を彼らは、コンパイラが__EPIへの呼び出しを発するようになりますし、 __PROユーザー定義フックルーチンes。

関数プロローグ・シーケンスを生成する直前の文字の文字列としてオブジェクト・コードに関数名を出力します
-en   emit routine names in the code segment 

もあります。 __PROルーチンに役立つかもしれません。これらおよびその他のコンパイラオプションで

詳しい情報は、デバッグやログのいくつかのフォームのためにこれを使用している場合を除き、これはとして私を打つhttp://openwatcom.org/index.php/Manuals